2014-10-26 3 views
2

компании Apple Swift language documentation говорит, что необязательно связывание (а.к.а. if let) будет «проверить значение внутри необязательный» и «экстракта этого значения в» переменный или постоянная). Но это не соответствует тому, что я вижу. НапримерПочему необязательное связывание Swift в определенных случаях преуспевает с «nil»?

var x: Int? = nil 

if let y1: Int? = x { 
    println("y1 = \(y1)") // This is printed, suggesting that x is not checked "inside", but left as Optional(nil) (!= nil) 
} 

if let y2: Int? = x? { 
    println("y2 = \(y2)") 
} 

if let y3: Int = x? { 
    println("y3 = \(y3)") 
} 

if let y4: Int = x { 
    println("y4 = \(y4)") 
} 

if let y5 = x? { 
    println("y5 = \(y5)") 
} 

if let y6 = x { 
    println("y6 = \(y6)") 
} 

приводит (только)

"y1 = nil" 

предполагая, что никакой проверки «внутри» из x не происходит в y1 случае (и что x остается, как завернуты nil, который не равно развернутому nil). Случай y2, похоже, подтверждает это, заставляя «проверять внутри» (или это только необязательная цепочка «захват»); но в этой истории должно быть больше, так как случаи y4 и y6 также не печатаются и, следовательно, ведут себя так, как будто происходит «проверка внутри».

Я подозреваю, что есть некоторое представление о том, чтобы быть получен от попыток

"x = 42" 

, что приводит к

"y1 = Optional(42)" 
"y2 = Optional(42)" 
"y3 = 42" 
"y4 = 42" 
"y5 = 42" 
"y6 = 42" 

но если три каким-то там, он потерял на меня.

Похоже, что (1) «необязательный» в правой части выражения действительно «проверяется внутри», если запрашивается явная проверка (с ?); но в противном случае (2) левая часть выражения влияет на то, как выполняется «внутри» проверки (достаточно далеко, чтобы сделать допустимое назначение).

Как необязательно связывать работу в каждом из этих случаев? В частности, когда x == nil почему y1 печатает, и учитывая, что это так, почему бы не y4 и y6 (или создать ошибки присваивания)?

ответ

2

интерпретировать это по-разному:

var x: Int? = 1 

if let y1: Int = x { 
    println("y1 = \(y1)") 
} 

//prints y = 1, the optional was checked, contains a value and passes it 

var x: Int? = nil 

if let y1: Int = x { 
    println("y1 = \(y1)") 
} 

//does not execute because x does not contain value that can be passed to a non optional y 

var x: Int? = nil 

if let y1: Int? = x { 
    println("y1 = \(y1)") 
} 
// y = nil, since y is optional and can hold a value of x which is nil, then it passes nil 

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

+0

Так оно выглядит так: правая сторона сначала проверяется на «опциональную цепочку» (где заканчивается первый конец 'y2',' y3' и 'y5'). Тогда, если это не 'nil', тогда все происходит, если можно сделать действительное назначение. Это так просто? – orome

+0

Да, если в любом месте по цепочке, то нет, привязка не удастся. Если вам нужно знать, где привязка не удалась, здесь есть хорошая дискуссия: http://stackoverflow.com/questions/26524246/how-to-know-where-optional-chaining-is-breaking –

+0

Итак: В случаях ' y2', 'y3' и' y5' опционально * цепочка * попадает в 'nil' и все заканчивается. В случаях 'y4' и' y6' выполняется проверка внутри 'x', а' nil' найдено (и не может быть назначено на необязательный), поэтому все заканчивается. Но я все еще смущен точно о том, что происходит с 'y1': похоже, что здесь нет« проверки внутри ». Если бы это произошло, все могло бы потерпеть неудачу (например, 'если пусть y1: Int? = Nil {...}' не работает).Кажется, что «проверка внутри» происходит * по мере необходимости, чтобы заставить работу работать *. – orome

1

Вы назначили дополнительный Int для дополнительного Int. Назначение выполнено успешно. Это всегда будет успешным, будь то дополнительный Int, содержащий Int или нет.

+0

Таким образом, «проверка внутри» не происходит в этом случае ('y1'). Такие проверки, по-видимому, происходят только тогда, когда это необходимо для выполнения задания (случаи 'y4' и' y6', как показано, когда 'x' не является' 'nil'). Правильно? – orome

+0

Суть здесь (для меня) - вот почему 'let y1: Int? = nil {...} 'ведет себя иначе, чем' let y1: Int? = x {...} 'где' x' 'nil'. (См. Обсуждение [другой ответ] (http://stackoverflow.com/a/26576451/656912)). – orome

Смежные вопросы