2015-01-16 3 views
13

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

Что такое ошибка компилятора? Если я должен был догадаться, это связано с тем, что создание кортежа не приводит к произвольному результату. –

+1

Вы действительно хотите связать кортеж, или просто хотите связать два варианта в одном выражении? Если последний, это дубликат [Использование «if let ...» со многими выражениями] (http://stackoverflow.com/q/24118900/957768), который имеет краткое решение по Swift 1.2/Xcode 6.3. – rickster

ответ

18

редактировать: от Swift 1.2 в Xcode 6.3, теперь вы можете сделать:

if let user = user, pass = pass { } 

связать несколько распакованных необязательные значения.

Вы не можете использовать дополнительное связывание таким образом. let test = (user,pass) не компилируется, так как (user,pass) не является необязательным - это кортеж, который содержит optionals. То есть, это (Int?,Int?) не (Int,Int)?.

Это должно делать то, что вы хотите, и позволяет связать два элемента одновременно:

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

Вы можете использовать 'break' в случаях с операторами switch без кода, для меня это кажется более связным. –

+1

Хороший момент, который, вероятно, приятнее. Хотя я никогда не обнаружил, что мне не нужна дефолт (и на самом деле хотелось бы, чтобы выражения switch были выражениями, в этом случае вам нужно было бы вернуть значение значимого значения). –

+0

Привет. Благодарим за ваше предложение. Что такое «.Some()» Он выглядит как элемент перечисления со связанным значением. Откуда он работает и как он работает в этом случае? – RMH

2

Вы должны использовать switch как другой ответ указывает. Однако, , если вы только собираетесь проверить оба значения, ifбез Дополнительное связывание на самом деле короче и легче читать.

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

switch тупой и жесткий для чтения (из другого ответа), но если вы собираетесь использовать другие случаи (ноль-некоторые, некоторые-ноль, ноль-ноль), то это может стоить того.

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

В Swift 2 с дополнительным рисунком соответствие можно написать

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

Это особенно полезно, если, например, (пользователь, проход) является кортеж хранится в переменной.