Swift可选绑定元组

时间:2015-01-16 19:29:19

标签: ios swift optional

我正在尝试在Swift的IF语句中使用元组作为可选绑定,但它不会编译,并且该错误消息不太有用。为什么以下没有编译?

let user:String? = "billy"
let pass:String? = "password"

if let test = (user?,pass?){
    print("this works")
}

或者

let user:String? = "billy"
let pass:String? = "password"

if let test = (user,pass){
    print("this works")
}

5 个答案:

答案 0 :(得分:18)

编辑:从Xcode 6.3中的Swift 1.2开始,您现在可以:

if let user = user, pass = pass { }

绑定多个未包装的可选值。

您不能以这种方式使用可选的let绑定。由于let test = (user,pass)不是可选项,因此(user,pass)将无法编译 - 它是包含选项的元组。也就是说,它是(Int?,Int?)而不是(Int,Int)?

这应该做你想要的,并允许你同时绑定两个项目:

switch (user, pass) {
    case let (.Some(user), .Some(pass)):
        print("this works: \(user), \(pass)")
    default: ()  // must handle all cases
}

答案 1 :(得分:3)

在带有可选模式匹配的Swift 2中,您可以编写

if case let (user?, pass?) = (user, pass) { }

例如,如果(user,pass)是存储在变量中的元组,则此功能特别有用。

答案 2 :(得分:2)

您必须使用switch作为其他答案。但是,如果您只是要检查两个值,则if 不带可选绑定实际上更短且更易于阅读。

if (user != nil && pass != nil) {
    print("this works: \(user!), \(pass!)")
}

switch愚蠢且难以阅读(取自其他答案),但如果您要使用其他案例(nil-some,some-nil,nil-nil)那么它可能是值得的。

switch (user, pass) {
    case let (.Some(user), .Some(pass)): print("this works: \(user), \(pass)")
    default: ()
}

答案 3 :(得分:0)

if case let (.some(user), .some(pass)) = (optionalUser, optionalPass) {
    print("user \(user). pass \(pass)")
}

答案 4 :(得分:-1)

比方说,我们有两个可选Int的元组。要解包,我们可以选择使用as?将其转换为(Int,Int)。如果其中任何一个为nil,则将无法强制转换。如果是这样,我们将从该元组中获取展开的值。

let tuple: (Int?, Int?) = (1, 2)
if let (value1, value2) = tuple as? (Int, Int) {
     print("value1: \(value1), value2: \(value2)")
} 

//value1: 1, value2: 2