我想在Swift中聲明一個採用可選閉包的參數。我已經宣佈的功能如下:如何在swift中進行可選閉包?
class Promise {
func then(onFulfilled:()->(), onReject:()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
但是斯威夫特抱怨說,「在條件綁定值必須是一個可選的類型」,其中「如果讓」聲明。
我想在Swift中聲明一個採用可選閉包的參數。我已經宣佈的功能如下:如何在swift中進行可選閉包?
class Promise {
func then(onFulfilled:()->(), onReject:()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
但是斯威夫特抱怨說,「在條件綁定值必須是一個可選的類型」,其中「如果讓」聲明。
您應該將可選閉包括在括號內。這將適當地確定?
運營商的範圍。
func then(onFulfilled:()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
爲了使代碼更短,我們可以用nil
作爲默認值onReject
參數和可選鏈接?()
調用它的時候:
func then(onFulfilled:()->(), onReject: (()->())? = nil) {
onReject?()
}
這樣我們就可以省略onReject
參數時,我們稱之爲then
功能。
then({ /* on fulfilled */ })
我們也可以使用尾隨關閉語法onReject
參數傳遞到then
功能:
then({ /* on fulfilled */ }) {
// ... on reject
}
這裏是一個blog post了。
因爲我認爲,這種「可選」關閉應該乾脆什麼也不做,你可以使用一個參數與空閉合爲默認值:
func then(onFulfilled:()->(), onReject:()->() = {}){
// now you can call your closures
onFulfilled()
onReject()
}
這個功能現在可以帶或不帶onReject
被稱爲回調
then({ ... })
then({ ... }, onReject: { ... })
不需要Swift的真棒Optionals?
在這裏!
也許這是一個更清潔的方式。特別是當閉包有複雜的參數時。
typealias SimpleCallBack =() ->()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}
你知道把它括在圓括號裏的理由是什麼嗎? – Marcosc
可能會消除歧義。如果可選閉包有一個返回值,它可能會混淆'() - > Int?'的含義。 – Cezar
另外,從Swift的書中:「當聲明一個可選類型時,一定要使用括號來正確限定?運營商。作爲一個例子,爲了聲明一個可選的整數數組,將類型註釋寫爲(Int [])?寫入Int []?產生一個錯誤。「 – Cezar