В документации по языку Swift от Apple говорится, что необязательное связывание (также известное как if let
) "проверит значение внутри необязательного" и "извлечет это значение в" переменную или константу). Но это не соответствует тому, что я вижу. Например
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
(или не генерируются ошибки присваивания)?