swift基础

1> 导入框架 :import UIKit
2> 定义标识符: let/var let a:Int = 20
3> 语句结束时;可以省略
4> print(a)
常量变量
1> 在开发中,优先使用常量(let). 只有发现标识符需要修改时,再使用变量
// 目的: 防止在其它不希望修改的地方,不小心将值修改掉
2> 常量的本质: 指向的内存地址不可以修改,但是可以通过内存地址找到对应的对象,之后修改对象内部的属性
let view : UIView = UIView()
view.backgroundColor = UIColor.blue
基本运算
将Int类型转成Double: Double(标识符)
逻辑分支 if
1> if后面的()可以省略掉
2> 没有非0(nil)即真
逻辑分支 guard
条件不满足时才执行else里面的语句
guard age >= 18 else {
print("回家去")
return
}
逻辑分支 switch
1.switch的基本使用
1> switch()可以省略
2> case结束可以不加break
2.基本使用补充
1> case后面可以跟上多个条件
2> 如果希望产生case穿透,可以在case结束时fallthrough
3.可以判断多种类型
1> 浮点型
2> 字符串
3> 区间类型
循环使用 for

  1. Swift中for循环现在只支持区间遍历 0..<10/0...9
    2.在swift开发中,如果一个变量/常量暂停不会使用,那么可以使用_来代替
    循环使用 while
    1> while后面()可以省略
    2> 没有非0(nil)即真 Bool(true/false)

字符串
1.字符串的定义
1> 不可变字符串的定义 let str = "Hello Swift"
2> 可变字符串的定义 var strM = "Hello World"
2.获取字符串的长度 let length = str.characters.count
3.字符串的拼接
1> 字符串之间的拼接 let str3 = str1 + str2
2>字符串和其它标识符之间的拼接 "(标识符)"
let name = "why"
let age = 19
let infoStr = "my nams is (name), age is (age)"
3> 字符串拼接过程中格式化: String(format:"%d:%d", 参数)
4.字符串的截取
1>方式一: 将String转成NSString,再进行截取(推荐)
let header1 = (urlString as NSString).substring(to: 3)
let range1 = NSMakeRange(4, 5)
let middle1 = (urlString as NSString).substring(with: range1)
let footer1 = (urlString as NSString).substring(from: 10)
2> 方式二: 直接使用String中方法,进行截取. String.Index (不好用)
数组
1.数组的定义
1> 定义不可变数组 let array1 = ["why", "yz"]

    2> 定义可变数组 var arrayM = [String]()

2.对可变数组的基本操作
增删改查 arrayM.append("why") arrayM.remove(at: 0)
arrayM[0] = "yz" let item = arrayM[1]
3.数组的遍历
1> 获取数组的长度 let count = array.count
2> 数组的遍历(i/item/index-item)
获得下标 for i in 0..<count
获得下标 for item in array
既获取下标值,又获取元素 for (index, item) in array.enumerated()
4.数组的合并,两个数组中存放的是相同的元素直接合并 array1 + array2
字典
1.定义的定义
1> 不可变字典: let dict : [String : Any] = ["name" : "why", "age" : 18]

2> 可变字典: var dictM = [String : Any]()

2.对可变字典的基本操作
增删改查 dictM["name"] = "why" dictM.removeValue(forKey: "height")
3.遍历字典
1> 所有的key for key in dict.keys
2> 所有的value for value in dict.values
3> 所有的key/value for (key, value) in dict2
4.字典合并
dict1 可变 dict2 不可变
for (key, value) in dict2 {
dict1[key] = value
}

元组
使用元组保存信息(取出数据时,更加方便)
写法1 let infoTuple0 = ("why", 18, 1.88) let tupleName = infoTuple0.0
写法2 let infoTuple1 = (name : "why",age : 18, height : 1.88) infoTuple1.age
写法3 let (name, age, height) = ("why", 18, 1.88) name
可选类型
在开发中,只有可选类型才能赋值为nil, 其它类型都不能赋值为nil
只要一个类型有可能为nil, 那么这个标识符的类型一定是一个可选类型
1.定义可选类型 var name : String? = nil
2.给可选类型进行赋值 name = "why"
3.从可选类型中取值
if let name = name {
print(name)
}

类型转换

  1. as使用 (str as NSString).substring(to: 6)
  2. as?转成可选类型 let name = tempName as? String
  3. as!转成具体的类型 如果确定转化成功,再用as!, 平时不建议
    函数
    内部参数: func sum(_ num1 : Int, _ num2 : Int) -> Int
    外部参数: func sum(num1 : Int, num2 : Int, num3 : Int) -> Int
    可变参数: func sum(_ nums : Int...) -> Int
    默认参数 func makeCoffee(coffeeName : String = "雀巢") -> String
    指针函数
    func swapNum(num1 : inout Int, num2 : inout Int) {
    let temp = num1
    num1 = num2
    num2 = temp
    }
    swapNum(num1: &m, num2: &n)
    枚举
    创建枚举1
    enum Direction : Int {
    case east = 0
    case west = 1
    case north = 2
    case south = 3
    }
    创建枚举2
    enum Direction {
    case east, west, north, south

}
1>当原始值的类型为整数时,系统将隐式地对成员值赋值且值依次递增1,若第一个成员值没有设置原始值,则默认为0。
2>当原始值的类型为String类型时,每个枚举成员的隐式原始值是该成员的名称

结构体
1.定义结构体
struct Location {
var x : Double
var y : Double
// 最普通的函数: 该函数是没有用到成员属性
func test() {
print("结构体中的test函数")
}
// 改变成员属性 : 如果在函数中修改了成员属性, 那么该函数前必须加上mutating
mutating func moveH(_ distance : Double) {
self.x += distance
}
// 给结构体扩充构造函数
// 1> 默认情况下, 系统会为每一个结构体提供一个默认的构造函数, 并且该构造函数, 要 求给每一个成员属性进行赋值
// 2> 构造函数都是以init开头, 并且构造函数不需要返回值
// 3> 在构造函数结束时, 必须保证所有的成员属性有被初始化
init(xyStr : String) {
// 20,30 --> ["20", "30"]
let array = xyStr.components(separatedBy: ",")
let item1 = array[0]
let item2 = array[1]
// ?? 判断前面的可选类型是否有值
// 有值, 则解包, 没有值,则使用后面的值
self.x = Double(item1) ?? 0
self.y = Double(item2) ?? 0
}
}
2.创建结构体对应的值 var center = Location(x: 20, y: 30)
3.系统结构体的创建方式 let size = CGSize(width: 20, height: 20)
4.给结构体扩充方法 center.test() center.moveH(20)
5.给结构体扩充构造函数 Location(xyStr : "20,30")
**类似于class 但是class是类型引用,而struct是值引用
struct没有继承的功能,class有继承功能
swift在本质上来说是面向协议的, 所以使用struct+protocol是构成swift面向协议语言的基础
义的对象类型 都可以改成结构体去定义
模型 都可以改成机构体
Swift 常用的 String, Array, Dictionary 都是 struct
结构体封装少量相关简单数据值
数据需要被拷贝而不是被引用,不需要继承的时候
类的使用
1.如何定义类
class Person {
// 如果属性是值类型, 则初始化为空值
// 如果属性是对象类型, 则初始化为nil值
var name : String = ""
var age : Int = 0
var view : UIView?
}
2.创建类的对象
let view = UIView()
类的构造函数(KVC)
使用KVC条件
1> 必须继承自NSObject
2> 必须在构造函数中,先调用super.init()
3> 调用setValuesForKeys
4> 如果字典中某一个key没有对应的属性, 则需要重写setValue forUndefinedKey
class Person : NSObject {
var name : String = ""
var age : Int = 0
var height : Double = 0
init(dict : [String : Any]) {
super.init()
setValuesForKeys(dict)
}
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
类的析构函数 -相当dealloc
class Person {
var name : String = ""
var age : Int = 0
// 重写析构函数, 监听对象的销毁
deinit {
print("Person --- deinit")
}
}
var p : Person? = Person()
p = nil
循环引用解决方案
OC中表示弱引用 __weak/__unsafe_unretained(野指针错误)
Swift中表示弱引用 weak/unowned(野指针错误)
// unowned 不能用于修饰可选类型
unowned var owner : Person = Person()
可选链
当类中包含的元素特别多时,可以把里面的元素单独出类来包含,取值时可使用可选链
1> 从可选链中进行取值?.
2> 给可选链进行赋值
3> 可选链调用方法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容