Подтвердить что ты не робот

Быстрая необязательная привязка с кортежами

Я пытаюсь использовать кортеж в качестве необязательного связывания в инструкции 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")
}
4b9b3361

Ответ 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) является кортежем, хранящимся в переменной.