一、Swift還增長了Objective-C中沒有的類型好比元組(Tuple)。swift
元組可讓你建立或者傳遞一組數據,好比做爲函數的返回值時,你能夠用一個元組能夠返回多個值。數據結構
元組(tuples)把多個值組合成一個複合值。元組內的值可使任意類型,並不要求是相同類型。閉包
//能夠經過下標來訪問元組中的單個元素
let http404Error =(404,"Not Found") println("The status code is \(http404Error.0)")
//給元組中的元素命名後,你能夠經過名字來獲取這些元素的值 let http200Status =(statusCode: 200,description: "OK") println("The status code is \(http200Status.statusCode)")
注意:元組在臨時組織值的時候頗有用,可是並不適合建立複雜的數據結構。若是你的數據結構並非臨時使用,請使用類或者結構體而不是元組。async
二、Swift還增長了可選(Optional)類型,用於處理值缺失的狀況。ide
Swift定義的常量和變量是沒有默認值的,因此引入了可選的概念,用?修飾變量,標示該變量的值可能爲空也可能爲某個值,而後獲取的時候用!強制解析,此時必須有值,不然報運行時錯誤。函數
三、常量的值一旦設定就不能改變,而變量的值能夠隨意更改。常量和變量必須在使用前聲明,用let來聲明常量,用var來聲明變量。所謂改變,對於基本數據類型而言,值改變就是改變,而對於引用數據類型而言,指針指向改變纔是改變。spa
四、類型別名(type aliases)就是給現有類型定義另外一個名字。你可使用typealias關鍵字來定義類型別名。指針
五、屬性監視器code
willSet在設置新的值以前調用server
didSet在新的值被設置以後當即調用
六、繼承
若是子類實現和父類相同的方法或者屬性就是重寫。必須用override關鍵字代表。
防止重寫,你能夠經過把方法,屬性或附屬腳本標記爲final來防止它們被重寫。
七、構造方法
與Objective-C中的構造器不一樣,Swift的構造器無需返回值,它們的主要任務是保證新實例在第一次使用前完成正確的初始化。
構造器分爲指定構造器和便利構造器,原則:指定構造器是向上調用的,便利構造器是橫向調用的。
規則1:指定構造器必須調用其父類的指定構造器
規則2:便利構造器必須調用同一類中調用的其餘構造器
規則3:便利構造器必須以調用一個指定構造器結束
//指定構造器(默認構造方法),由於父類也有該方法,因此用override override init() { super.init() print("Student init") } //指定構造器(自定義構造方法,父類沒有該方法,不須要override) init(size:Double) { super.init(size: size) print("Student init with size") } //便利構造器(使用關鍵詞convenience,須要調用本身的構造方法) convenience init(size:Double,friendNums:Double){ self.init(size:size) self.friendNums = friendNums }
八、類擴展,至關於OC分類
添加計算型屬性和計算靜態屬性
注意:擴展能夠添加新的計算屬性,可是不能夠添加存儲屬性,也不能夠向已有屬性添加屬性觀測器(property observers)
定義實例方法和類型方法
提供新的構造器
定義下標
定義和使用新的嵌套類型
使一個已有類型符合某個接口
九、循環引用的問題
使用弱引用weak和無主引用unowned修飾一方變量。
兩個屬性的值均可能是nil,並有可能產生強引用環。這種場景下適合使用弱引用。
var a:A?
weak b:B?
一個屬性能夠是nil,另一個屬性不容許是nil,並有可能產生強引用環。這種場景下適合使用無主引用。
var a:A? unowned b:B override init(){ self.b = B() }
兩個屬性都必須有值,且初始化完成後不能爲nil。這種場景下,則要一個類用無主引用屬性,另外一個類用隱式展開的可選屬性。
var a:A! override init(){ self.a = A() } unowned b:B override init(){ self.b = B() }
在oc中,咱們須要在代碼塊用到self時,能夠直接把self付給其餘變量,而後在塊中使用完畢後製空,或者像下面弱引用self來避免循環引用:
__weak typeof(self) weakSelf = self;
在swift中
//這裏用gcd舉例很差,畢竟系統的塊不會形成循環引用,這裏就勉強的學一下怎麼改吧 dispatch_async(dispatch_get_global_queue(0, 0)) {[unowned self] () -> Void in self.view //添加本身的代碼
}
十、檢查類型
用類型檢查操做符(is)來檢查一個實例是否屬於特定子類型。
某類型的一個常量或變量可能在幕後實際上屬於一個子類。你能夠相信,上面就是這種狀況。你能夠嘗試向下轉到它的子類型,用類型轉換操做符(as)
若是強制轉型確定成功,可使用as!,若是使用as?,那麼返回結果成功則爲該轉的類型,失敗則爲空,此時可使用if let來接收判斷。
十一、AnyObject
AnyObject相似於OC中的id類型,表示任意的class的實例對象,可是在Swift中,例如咱們常見的String和Array都變爲結構體了,並且在Swift3.0中,更多的類型或者枚舉被寫爲結構體了,AnyObject的適用範圍變相被削弱了,因此在Swift3.0的API中曾經許多AnyOjbect的類型被替換爲Any了。
AnyObject的自動類型轉換
OC的NSArray
裏面只能保存對象類型, 不能添加基本數據類型,如枚舉、結構體等.
Swfit裏面將Array的元素類型聲明成 AnyObject,
swift會自動將基本數據類型123轉換爲NSNumber
對象類型。
let array = ["123",123]
Any 能夠表示任何類型,包括函數類型、基本數據類型。
let a:[Any] = ["123",123]
AnyClass: 表示任意類的元類型.任意類的類型都隱式遵照這個協議.
public typealias AnyClass = AnyObject.Type
十二、閉包
Swift中的閉包與C和Objective-C中的blocks有點相似。
閉包表達式語法
{(parameters)-> returnType in
statements
}
1三、在swif中的互斥鎖
@synchronized(self) { //須要執行的代碼塊 }
objc_sync_enter(self) //須要執行的代碼塊 objc_sync_exit(self)