компании 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
(или создать ошибки присваивания)?
Так оно выглядит так: правая сторона сначала проверяется на «опциональную цепочку» (где заканчивается первый конец 'y2',' y3' и 'y5'). Тогда, если это не 'nil', тогда все происходит, если можно сделать действительное назначение. Это так просто? – orome
Да, если в любом месте по цепочке, то нет, привязка не удастся. Если вам нужно знать, где привязка не удалась, здесь есть хорошая дискуссия: http://stackoverflow.com/questions/26524246/how-to-know-where-optional-chaining-is-breaking –
Итак: В случаях ' y2', 'y3' и' y5' опционально * цепочка * попадает в 'nil' и все заканчивается. В случаях 'y4' и' y6' выполняется проверка внутри 'x', а' nil' найдено (и не может быть назначено на необязательный), поэтому все заканчивается. Но я все еще смущен точно о том, что происходит с 'y1': похоже, что здесь нет« проверки внутри ». Если бы это произошло, все могло бы потерпеть неудачу (например, 'если пусть y1: Int? = Nil {...}' не работает).Кажется, что «проверка внутри» происходит * по мере необходимости, чтобы заставить работу работать *. – orome