有時候我們可以將一段 swift 的敘述 (closure) 傳給副程式 (function), 讓它去處理, 就可以在副程式中宣告將傳進來的變數名稱型別隸屬於 closure 型別也就是 ()
func my(ac: () -> Int) {
// After evaluation by using the () , following code will be executed
switch ac() { Void -> Int in
case 1 : print("expression is: 1")
case 2 : print("expression is: 2")
default : print("expression known")
}
}
my( {1} )
my( {2} )
my( {4} )
甚至因為該 closure 位在最後一個參數, 因此呼叫時其實可以將小括號 () 省略
my {1}
my {2}
my {3}
另外你也可以讓function 裏面的 closure 延後執行, 只要注意將返回值傳回正確的型別:
my { Void -> Int { // TYPE as defined by the closure
print("Do something here")
return 1 // Evaluate here, closure should return a Int value accordingly.
}
如果說將 closure 冠上屬性 @autoclosure, 也就是讓 swift自動打包(自動將敘述加上closure{}), 之後呼叫該程序就不用再加上大括號了.
func my(@autoclosure ac: () -> Int) {
switch ac() {
case 1 : print("expression is: 1")
case 2 : print("expression is: 2")
default : print("expression known")
}
}
my(1)
my(2)
my(4)
雖說 closure 位於 function 裏最後一個參數, 但此時如果省略掉小括號 (), swift 會無法判斷該敘述而產生錯誤. @autoclosure 似乎只能運用在一些需要將運算符(operator)修改的作用上. 還不是很明瞭他的詳細運作, 需要再深入 study ...
沒有留言:
張貼留言