1.你能夠將一個繼承來的只讀屬性重寫爲一個讀寫屬性,只須要在重寫版本的屬性裏提供 getter 和 setter 便可。可是,你不能夠將一個繼承來的讀寫屬性重寫爲一個只讀屬性。javascript
2.你能夠經過把方法,屬性或下標腳本標記爲final
來防止它們被重寫,只須要在聲明關鍵字前加上final
修飾符便可(例如:final var
,final func
,final class func
,以及final subscript
)。java
3.若是要重寫某個特性,你須要在重寫定義的前面加上override
關鍵字。這麼作,你就代表了你是想提供一個重寫版本,而非錯誤地提供了一個相同的定義。意外的重寫行爲可能會致使不可預知的錯誤,任何缺乏override
關鍵字的重寫都會在編譯時被診斷爲錯誤。swift
4.當你爲存儲型屬性設置默認值或者在構造器中爲其賦值時,它們的值是被直接設置的,不會觸發任何屬性觀察者(property observers
)。閉包
5.構造器並不像函數和方法那樣在括號前有一個可辨別的名字。所以在調用構造器時,主要經過構造器中的參數名和類型來肯定應該被調用的構造器。正由於參數如此重要,若是你在定義構造器時沒有提供參數的外部名字,Swift 會爲每一個構造器的參數自動生成一個跟內部名字相同的外部名。ide
6.即便你重寫的是系統自動提供的默認構造器,也須要帶上override
修飾符函數
7.你能夠在一個類,結構體或是枚舉類型的定義中,添加一個或多個可失敗構造器。其語法爲在init
關鍵字後面加添問號init?
ui
可失敗構造器會建立一個類型爲自身類型的可選類型的對象。你經過return nil
語句來代表可失敗構造器在何種狀況下應該「失敗」。spa
8.在類的構造器前添加required
修飾符代表全部該類的子類都必須實現該構造器。重寫父類中必要的指定構造器時,不須要添加override
修飾符code
9.Swift 提供了兩種辦法用來解決你在使用類的屬性時所遇到的循環強引用問題:弱引用(weak reference)和無主引用(unowned reference)。server
對於生命週期中會變爲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 // 這裏是閉包的函數體 }