1.你可以将一个继承来的只读属性重写为一个读写属性,只需要在重写版本的属性里提供 getter 和 setter 即可。但是,你不可以将一个继承来的读写属性重写为一个只读属性。
2.你可以通过把方法,属性或下标脚本标记为final
来防止它们被重写,只需要在声明关键字前加上final
修饰符即可(例如:final var
,final func
,final class func
,以及final subscript
)。
3.如果要重写某个特性,你需要在重写定义的前面加上override
关键字。这么做,你就表明了你是想提供一个重写版本,而非错误地提供了一个相同的定义。意外的重写行为可能会导致不可预知的错误,任何缺少override
关键字的重写都会在编译时被诊断为错误。
4.当你为存储型属性设置默认值或者在构造器中为其赋值时,它们的值是被直接设置的,不会触发任何属性观察者(property observers
)。
5.构造器并不像函数和方法那样在括号前有一个可辨别的名字。因此在调用构造器时,主要通过构造器中的参数名和类型来确定应该被调用的构造器。正因为参数如此重要,如果你在定义构造器时没有提供参数的外部名字,Swift 会为每个构造器的参数自动生成一个跟内部名字相同的外部名。
6.即使你重写的是系统自动提供的默认构造器,也需要带上override
修饰符
7.你可以在一个类,结构体或是枚举类型的定义中,添加一个或多个可失败构造器。其语法为在init
关键字后面加添问号init?
可失败构造器会创建一个类型为自身类型的可选类型的对象。你通过return nil
语句来表明可失败构造器在何种情况下应该“失败”。
8.在类的构造器前添加required
修饰符表明所有该类的子类都必须实现该构造器。重写父类中必要的指定构造器时,不需要添加override
修饰符
9.Swift 提供了两种办法用来解决你在使用类的属性时所遇到的循环强引用问题:弱引用(weak reference)和无主引用(unowned reference)。
对于生命周期中会变为nil
的实例使用弱引用。相反地,对于初始化赋值后再也不会被赋值为nil
的实例,使用无主引用。
弱引用必须被声明为变量,表明其值能在运行时被修改。弱引用不能被声明为常量。因为弱引用可以没有值,你必须将每一个弱引用声明为可选类型。
10.和弱引用不同的是,无主引用是永远有值的。因此,无主引用总是被定义为非可选类型(non-optional type)。你可以在声明属性或者变量时,在前面加上关键字unowned
表示这是一个无主引用。如果你试图在实例被销毁后,访问该实例的无主引用,会触发运行时错误。使用无主引用,你必须确保引用始终指向一个未销毁的实例。
11.捕获列表中的每一项都由一对元素组成,一个元素是weak
或unowned
关键字,另一个元素是类实例的引用(例如self
)或初始化过的变量(如delegate = self.delegate!
)。这些项在方括号中用逗号分开。
如果闭包有参数列表和返回类型,把捕获列表放在它们前面:
lazy var someClosure: (Int, String) -> String = {
[unowned self, weak delegate = self.delegate!] (index: Int, stringToProcess: String) -> String in
// 这里是闭包的函数体
}