我可以在Swift的一行中以某种方式对多个变量使用可选绑定吗?

时间:2014-11-24 16:50:33

标签: ios swift

我能以某种方式在Swift的一行中为多个变量使用可选绑定吗?我需要做这样的事情:

if let foo = fooOptional && let bar = barOptional {
    // ...
}

3 个答案:

答案 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