可以以某種方式在Swift中爲一行中的多個變量使用可選綁定嗎?我需要做這樣的事情:我可以以某種方式在Swift中對一個行中的多個變量使用可選綁定嗎?
if let foo = fooOptional && let bar = barOptional {
// ...
}
可以以某種方式在Swift中爲一行中的多個變量使用可選綁定嗎?我需要做這樣的事情:我可以以某種方式在Swift中對一個行中的多個變量使用可選綁定嗎?
if let foo = fooOptional && let bar = barOptional {
// ...
}
更新雨燕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
}
這是一個非常合理的增強請求,但根據情況你不能這樣做。有各種各樣的原因,但我喜歡想的方式只是這樣:if let
是真的一個字。這是兩個字,但搭配if let
意味着一些特殊的東西,就好像它本身就是一個關鍵字。本身,if
具有不同的含義;本身,let
有不同的含義。因此,你不能像這樣在後面放置一個單獨的let
。
其結果是,我經常結束嵌套if let
子句的級聯。我相信你的問題的原因是你也這樣做,你想避免它。但你不能。另一種方法是完全跳過if let
,強制打開您的選擇項,並希望當其中一個爲零時不會崩潰。
感謝您的回答。順便說一句我看到了下面的代碼 - https://gist.github.com/jhaberstro/878f7f2043f922f0d06c,但評論說「段錯誤 - 似乎是代碼中的編譯器錯誤」 – FrozenHeart 2014-11-24 17:02:51
這是一個有點笨拙,但是你可以用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
}
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
我喜歡這個選項,當你只是想實現「如果所有可用」的情況下,在代碼中的默認開關感覺像是矯枉過正,這將保持你的代碼清潔。 – 2014-12-08 19:22:51
你的答案比我的好!:) – matt 2014-11-24 17:00:32
你可以用剛剛發佈的Swift 1.2! http://www.codingexplorer.com/multiple-optional-bindings-swift-1-2/(我知道這個問題很舊,但爲了防止任何人看到,你可能想更新你的答案) – SeeMeCode 2015-02-15 01:15:06