2014-06-24 22 views
72

我想在Swift中聲明一個採用可選閉包的參數。我已經宣佈的功能如下:如何在swift中進行可選閉包?

class Promise { 

func then(onFulfilled:()->(), onReject:()->()?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 

} 

但是斯威夫特抱怨說,「在條件綁定值必須是一個可選的類型」,其中「如果讓」聲明。

回答

85

您應該將可選閉包括在括號內。這將適當地確定?運營商的範圍。

func then(onFulfilled:()->(), onReject: (()->())?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 
+0

你知道把它括在圓括號裏的理由是什麼嗎? – Marcosc

+4

可能會消除歧義。如果可選閉包有一個返回值,它可能會混淆'() - > Int?'的含義。 – Cezar

+3

另外,從Swift的書中:「當聲明一個可選類型時,一定要使用括號來正確限定?運營商。作爲一個例子,爲了聲明一個可選的整數數組,將類型註釋寫爲(Int [])?寫入Int []?產生一個錯誤。「 – Cezar

38

爲了使代碼更短,我們可以用nil作爲默認值onReject參數和可選鏈接?()調用它的時候:

func then(onFulfilled:()->(), onReject: (()->())? = nil) { 
    onReject?() 
} 

這樣我們就可以省略onReject參數時,我們稱之爲then功能。

then({ /* on fulfilled */ }) 

我們也可以使用尾隨關閉語法onReject參數傳遞到then功能:

then({ /* on fulfilled */ }) { 
    // ... on reject 
} 

這裏是一個blog post了。

29

因爲我認爲,這種「可選」關閉應該乾脆什麼也不做,你可以使用一個參數與空閉合爲默認值:

func then(onFulfilled:()->(), onReject:()->() = {}){  
    // now you can call your closures 
    onFulfilled() 
    onReject() 
} 

這個功能現在可以帶或不帶onReject被稱爲回調

then({ ... }) 
then({ ... }, onReject: { ... }) 

不需要Swift的真棒Optionals?在這裏!

+0

好的解決方案! – Aznix

+0

我喜歡這個解決方案,更簡單易讀。 – keithics

+0

這是很好的解決方案! –

1

也許這是一個更清潔的方式。特別是當閉包有複雜的參數時。

typealias SimpleCallBack =() ->() 

class Promise { 

func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){  
    if let callableRjector = onReject { 
     // do stuff! 
    } 
} 

} 
相關問題