前言
此Session
进一步讲解了关于Swift
语言中的语法特性和设计特点,主要内容涉及:
-
Optional
可选类型 - 内存管理
- 初始化构造
-
Closures
闭包 - 模式匹配
内容
Optionals
针对其值不确定是否存在的变量
Optional
类型来声明;声明后存在两种状态,一种为有值状态,另一种为nil
状态即无值状态(直接声明为可选类型未设初始值时默认值为nil,其处于第二种状态)只有可选类型变量才能赋值为
nil
,对于非可选类型(平常的String,Int, Array
,类等)设为nil
会出现编译错误.
让某一类型变量成为可选类型,在其平常的类型后加?
如Int?, String?, UIVew?
,想要直接获取其可选类型变量内部的值,在其变量名后加!
(强制解包符号),若在其为nil
的情况下进行强制解包会造成运行时错误,使用前提必须保证在不为nil
情况下进行取值操作,因此官方不推荐使用!
强制解包符号进行对可选类型变量的取值.代替的方案为使用if-let
句式进行可选绑定操作,利用临时变量来存可选变量真正的值,形式如下:
if let value = OptionalValue {
print("the real value is \(value)")
} else {
print(it's nil);
}
- 可选链,针对在多个可选变量层级获取情况下所应对的快速简便语法,形成链式语式,其中有一个可选变量为
nil
则无需再向下访问直接返回nil
,即使最终全程可选类型访问有效且有值,使用时仍要进行解包操作,其原来返回也是可选类型的变量.
let value = optionalValueA?.optionalValueB?.optionalValueC?.optionalValueD? // still Optional Value`
- 可选类型内部结构为一个泛型的枚举,两个分支,默认为
None
分支即变量被设为nil
,也可以显示设置为nil
;另一个则为接受任何类型的变量为关联值的Some
分支,使得可选类型变量可以在有值的情况通过解包获取所存在的值.
enum Optional<T> {
case None
case Some(T)
}
Swift的内存管理
继续沿用
Objective-C
自动引用计数机制进行内存管理,绝多数情况下Swift
替开发者进行内存管理;存在强引用的对象的内存不会被系统回收,直至该对象上无强引用;
-
应对对象间循环引用的情况,
Swift
提供两种解决方法
- 使用
weak
关键字,使用弱引用指向对象,类似Objective-C
的weak
属性,在弱引用指向的对象释放后其原变量会被设为nil
(也说明weak
声明的变量必须为可选类型且用var
声明,在赋值、调用方法时需要解包操作) - 使用
unowned
关键字,表示不会对引用计数进行+1的引用,所引用的对象释放后也不会被设置为nil
,允许用let
声明的非可选类型变量,类似于Objective-C
的unsafe_unretain
属性
- 使用
初始化构造
根本原则: 所有值在对象实例使用前必须都已被初始化(包括设为
nil
).构造方法
init(..){...}
内部不允许在所有属性未初始化前调用方法(内部的方法调用实则隐式的self
实例调用,违背构造根本原则)结构体:
能自动生成构造方法;
若存在没有初始化或无默认值的属性,会生成相应的构造方法设置其属性的初始值;类:
由于继承的特性,构造方法被继承时,需要使用super
调用,注意调用时机,在所有本类属性初始化后才能进行父类初始化方法调用.
允许在调用父类初始化方法后,进行对继承的属性进行再一次修改和操作.
类的初始化方法分为Designated
和Convenience
两种,若存在父类,Designated
构造方法都要调用其父类的Designated
构造方法,而Convenience
构造方法还是依靠Designated
构造方法进行实例初始化;
有继承的类在所有属性都已有初始值的情况下,允许不实现自己的构造方法,自动继承父类的所有Designated
和Convenience
构造方法,若自己定义了构造方法,则不会继承父类的构造方法;属性的懒加载: 想让编译器知道该属性只有到需要访问时才会初始化使用
@lazy
关键字,并赋值为初始化完整的实例@lazy var manager = Manager()
析构方法:一般移除KOV或者通知的观察者,关闭文件,释放资源时才会用到.
闭包
一般写法
let closure = { (a, b) -> Bool in
return true
}
标准库闭包
- sort 排序闭包
- filter 过滤闭包
- map 映射闭包
- reduce 折合闭包
值捕获:
能自动获取上下文变量,进行访问和设置.
闭包和函数都是一种ARC对象,内部能引用和持有其他ARC对象,支持ARC内存管理机制
在值捕获过程中产生的循环引用,应对方法使用unowned
关键字
模式匹配
-
Switch
支持类实例对象,数据范围的匹配 - 枚举允许设置关联值,结合
Switch
,访问关联值 - 提供元组匹配,在
switch
中使用元组作为分支,并且支持where
的额外条件匹配
结尾
整体看下来,体会到了Swfit
语言对安全性和便利性的不断追求,不论从使用可选类型,遵循构造方法原则都体现着Swift
安全这一特性,目的就是为了让开发者能更加安全,有效地编码.