swift3 與 OC 語法區別

一、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的自動類型轉換
OCNSArray裏面只能保存對象類型, 不能添加基本數據類型,如枚舉、結構體等.
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中的互斥鎖

  • oc中的互斥鎖:
@synchronized(self) {
    //須要執行的代碼塊
}
  • swift中的互斥鎖
objc_sync_enter(self)
//須要執行的代碼塊
objc_sync_exit(self)
相關文章
相關標籤/搜索