Swift2到Swift3語法變化不完整總結

Swift3語法變化

Swift3和Swift2對比,更加安全和更加的面向對象了

  • Swift3廢棄了舊版本的C類型的GCD寫法,而換成了更加面向對象的全新的GCD寫法
DispatchQueue.global().async {
    DispatchQueue.main.async {
        callBack("{\"name\": \"xiaoming\"}");
    }
}
  • Swift3 閉包在方法內部使用限制的關鍵字修改爲了@noescape(默認值)和@escaping
    如果在方法內部執行了另一個閉包需要使用到方法參數的閉包,需要加上@escaping關鍵字
func loadData2(callBack: @escaping (_ resultJson: String)->()) -> Void {
    // swift3的GCD寫法
    self.resultCallback = callBack;
    DispatchQueue.global().async {
        DispatchQueue.main.async {
            callBack("{\"name\": \"xiaoming\"}");
        }
    }
}
  • Swift3閉包的使用避免循環引用
// 方法1,推薦的方式,使用weak關鍵字,如果block沒有參數需要在後面加上關鍵字in
MJRefreshNormalHeader { [weak self] in
    self?.loadStatus()
}
// 方法2,使用unowned關鍵字,相當於OC中的_unsafe_unretained 修飾符,
// 如果指向的對象銷燬,依然指向之前的內存地址,容易產生野指針,殭屍對象
MJRefreshNormalHeader { [unowned self] in
    self.loadStatus()
}
// 方式3,定義一個weak類型的變量
weak var weakSelf = self;
MJRefreshNormalHeader {
    self.loadStatus()
}
  • Swift3處理Selector
    selector是OC中的一種消息發送機制,Swift2可以使用這兩種發送提供一個selector, Swift3暫時支持這種方式,並且closeItemClick方法如果是private需要添加@objc關鍵字,讓selector暴露到OC中
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "關閉", style: .plain, target: self, action: "closeItemClick")
// 或者
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "關閉", style: .plain, target: self, action: Selector("closeItemClick"))
  • Swift3建議使用#selector(ComposeViewController.closeItemClick))這種方式提供一個消息的接受者,這種方式更加的安全,在編譯階段會檢測你的selector方法是否存在以及selector方法是否符合要求,不存在或者不符合會直接報錯編譯不過,Swift2中則沒有這麼安全
navigationItem.leftBarButtonItem = UIBarButtonItem(title: "關閉", style: .plain, target: self, action: #selector(ComposeViewController.closeItemClick))
// ......
@objc private func closeItemClick() {
    print("closeItemClick")        
}
// 或者使用
func closeItemClick() {
    print("closeItemClick")        
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章