Быстрая необязательная привязка с кортежами
Я пытаюсь использовать кортеж в качестве необязательного связывания в инструкции IF в Swift, но он не будет компилироваться и это сообщение об ошибке менее полезно. Почему следующая компиляция?
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")
}
Ответы
Ответ 1
edit: начиная с Swift 1.2 в Xcode 6.3 вы можете теперь делать:
if let user = user, pass = pass { }
для привязки нескольких необязательных необязательных значений.
Вы не можете использовать дополнительное связывание таким образом. let test = (user,pass)
не будет компилироваться, так как (user,pass)
не является необязательным - это кортеж, который содержит опции. То есть, это (Int?,Int?)
не a (Int,Int)?
.
Это должно делать то, что вы хотите, и позволяет вам одновременно связывать два элемента:
switch (user, pass) {
case let (.Some(user), .Some(pass)):
print("this works: \(user), \(pass)")
default: () // must handle all cases
}
Ответ 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
В Swift 2 с дополнительным сопоставлением шаблонов вы можете написать
if case let (user?, pass?) = (user, pass) { }
Это особенно полезно, если, например, (user, pass) является кортежем, хранящимся в переменной.