Swfit-@ autoclosure 詳解

@autoclosure 屬于swift中的一個全新的創造, 隨著swift語言的健壯,函數式編程的思想的滲透.閉包的應用也愈發的重要了起來.

而在使用閉包的過程中,我們常常會碰到這種書寫格式:


func logState(predict : ()->Bool){
  if predict() {
     print("can nslog")
  }else{
     print("can`t nslog")
  }
}
/// 調用
logState({1 > 0})

這樣小括號里鑲嵌大括號是十分不優雅的

索性,,我們有了@ autoclosure ,

于是代碼變成了:


func logState(@autoclosure predict : ()->Bool){
  if predict() {
    print("can nslog")
  }else{
    print("can`t nslog")
  }
}
/// 調用
logState (1 > 2)

這樣調用起來就舒服多了.

值得一提的是@ autoclosure的用法和注意事項,,首先遺憾的是@ autoclosure只支持無參的寫法 即:

()->T

這種格式...

其次最重要的是@ autoclosure引出了swift另一個強大的設計<延遲計算>
舉個栗子??:
swift 中判空的操作符?? 的內部實現

/// ??
public func ??<T>(optional: T?, @autoclosure defaultValue: () throws -> T) rethrows -> T

// 簡化版
func ??<T>(optional:T?,@autoclosure defaultValue: () ->T) -> T{
  switch optional{
   case .Some(let value):
         return value
   case .None:
         return defaultValue()
    }
 }

"在swift中optional(可選類型)是一個枚舉 Some / None"
實現方法很簡單,但是這里有一個問題:
'為什么defaultValue'是一個閉包而非直接傳'T'呢? 這樣做有什么好處呢?
試想遇到這種情況:
show me code---


func getResult() -> Int{
   // 耗時操作
      sleep(100)
}
var optional : Int?
let result = optional ?? self.getResult()

在這種情況下,如果 ?? defaultValue接受的是 T 類型不管switch 方法有沒有運行到.None的branch, T 都需要提供一個值來提供這個函數來使用,
這就造成了資源的不合理消耗,而使用閉包則不會發生這種情況,,,閉包只有在調用它的時候內部的斷碼段才會執行,,這就里利用了閉包的特性來巧妙的比較了資源的浪費.

下一章:
typealias

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容