2014-11-24 62 views

回答

20

更新雨燕1.2:

從雨燕1.2(的Xcode 6.3測試版),您可以解開多個自選與if let

if let foo = fooOptional, bar = barOptional { 
    println("\(foo), \(bar)") 
} 

雨燕1.2之前

你不能用if,但你可以用switch使用"Value-Binding Pattern"

switch (fooOptional, barOptional) { 
case let (.Some(foo), .Some(bar)): 
    println("\(foo), \(bar)") 
default: 
    break 
} 
+0

你的答案比我的好!:) – matt 2014-11-24 17:00:32

+0

你可以用剛剛發佈的Swift 1.2! http://www.codingexplorer.com/multiple-optional-bindings-swift-1-2/(我知道這個問題很舊,但爲了防止任何人看到,你可能想更新你的答案) – SeeMeCode 2015-02-15 01:15:06

0

這是一個非常合理的增強請求,但根據情況你不能這樣做。有各種各樣的原因,但我喜歡想的方式只是這樣:if let是真的一個字。這是兩個字,但搭配if let意味着一些特殊的東西,就好像它本身就是一個關鍵字。本身,if具有不同的含義;本身,let有不同的含義。因此,你不能像這樣在後面放置一個單獨的let

其結果是,我經常結束嵌套if let子句的級聯。我相信你的問題的原因是你也這樣做,你想避免它。但你不能。另一種方法是完全跳過if let,強制打開您的選擇項,並希望當其中一個爲零時不會崩潰。

+0

感謝您的回答。順便說一句我看到了下面的代碼 - https://gist.github.com/jhaberstro/878f7f2043f922f0d06c,但評論說「段錯誤 - 似乎是代碼中的編譯器錯誤」 – FrozenHeart 2014-11-24 17:02:51

6

這是一個有點笨拙,但是你可以用switch您變量的元組這樣做:

var fooOptional: String? = "foo" 
var barOptional: String? = "bar" 

switch (fooOptional, barOptional) { 
case let (.Some(foo), .Some(bar)): 
    println(foo + bar) 
default: 
    break 
} 

我用這個被向下鑽取到嵌套字典的時間,就像一個大的JSON對象 - 這是偉大的,因爲你可以分別處理每個錯誤情況:

switch (dict["foo"], dict["foo"]?["bar"], dict["foo"]?["bar"]?["baz"]) { 
case let (.Some(foo), .Some(bar), .Some(baz)): 
    // do things 
case (.None, _, _): 
    // no foo 
case (_, .None, _): 
    // no bar 
default: 
    // no baz 
} 
2

Swift之前1.2

我喜歡使用switch聲明,尤其是如果你想處理四種不同的情況。

但是,如果你在這兩個自選是Some的情況下僅僅是興趣,你也可以這樣做:

if let (firstName, lastName) = unwrap(optionalFirstName, optionalLastName) { 
    println("Hello \(firstName) \(lastName)!") 
} 

如果是這種unwrap函數的定義:

func unwrap<T1, T2>(optional1: T1?, optional2: T2?) -> (T1, T2)? { 
    switch (optional1, optional2) { 
    case let (.Some(value1), .Some(value2)): 
    return (value1, value2) 
    default: 
    return nil 
    } 
} 

更多過載:https://gist.github.com/tomlokhorst/f9a826bf24d16cb5f6a3

+1

我喜歡這個選項,當你只是想實現「如果所有可用」的情況下,在代碼中的默認開關感覺像是矯枉過正,這將保持你的代碼清潔。 – 2014-12-08 19:22:51

相關問題