我正在尝试在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")
}
答案 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