2017-04-07 102 views
1

在Swift中,是否有方法在內聯條件語句中展開可選內容?在某些情況下,nil合併運算符??不起作用,例如必須在函數中使用可選的解包函數。在內聯條件語句中展開可選

例如,假設f有簽名func f(a:Int) -> Bool和閱讀A ? B : Cif A { B } else { C }然後像下面可能是有意義的:使用!

var c:Int? 
let a:Bool = let b = c ? f(b) : false 

顯然,這是可以做到:

let a:Bool = b != nil ? f(b!) : false 

但我儘可能避免使用!

回答

1

是的。 map可以應用於可選項,如果值不是nil,則執行閉包,否則返回nil。然後,您可以使用零合併運算解開的map結果:

let a = b.map { f($0) } ?? false 

由於@Alexandar在評論中指出的,因爲你的函數只接受一個參數,你可以寫map剛好路過的函數名稱:

let a = b.map(f) ?? false 

完整示例

func f(_ a:Int) -> Bool { 
    return a > 17 
} 

var b:Int? = 18 

let a1 = b.map(f) ?? false 

print(a1) // true 

b = nil 

let a2 = b.map(f) ?? false 

print(a2) // false 

func map<U>(_ transform: (Wrapped) throws -> U) rethrows -> U? 

說明

求值時該可選實例不是nil,傳遞展開的值作爲參數給定的封閉件。 將map方法與返回非選項值的閉包一起使用。


+2

它甚至可以被簡化以去除不需要的閉合層:'b.map(F)??假' – Alexander

+0

感謝您的答案vacawama。謝謝@亞歷山大,我喜歡這個額外的整潔 – gfkeith

+0

謝謝,@亞歷山大。我用你的建議更新了我的答案。 – vacawama