我能以某种方式在Swift的一行中为多个变量使用可选绑定吗?我需要做这样的事情:
if let foo = fooOptional && let bar = barOptional {
// ...
}
答案 0 :(得分:21)
Swift 1.2的更新:
从Swift 1.2(Xcode 6.3 Beta),您可以使用if let
解包多个选项:
if let foo = fooOptional, bar = barOptional {
println("\(foo), \(bar)")
}
在Swift 1.2之前
您不能使用if
,但可以switch
使用"Value-Binding Pattern":
switch (fooOptional, barOptional) {
case let (.Some(foo), .Some(bar)):
println("\(foo), \(bar)")
default:
break
}
答案 1 :(得分: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 :(得分: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