Swift Optional Требуется уточнение
Я надеюсь, что кто-то может объяснить это мне.... (все еще довольно новый для Swift!)
Эта строка не работает, если часть ноль...
cell?.myTextField.text = part?.number
(фатальная ошибка: неожиданно найден ноль при развертывании необязательного значения)
тогда как эта строка работает...
cell?.myTextField?.text = part?.number;
В обоих случаях, если ячейка не равна nil, myTextField будет существовать. Я бы подумал, что если часть равна нулю, строка завершается ошибкой и текст не будет установлен. Но я должен установить myTextField на необязательный параметр, чтобы эта строка прошла.
Может кто-нибудь объяснить, почему это так? Моя путаница заключается в необходимости добавлять? до конца myTextField.
1 ответ
Я смог воссоздать вашу проблему (в основном) с помощью следующего:
class Part {
var number:String = "3"
}
class TextField {
var text: String! = nil
}
class Cell {
var myTextField: TextField! = nil
}
var part: Part? = nil
var cell:Cell? = Cell()
cell?.myTextField.text = part?.number // crashes
cell?.myTextField?.text = part?.number // works
Это сбой, потому что myTextField
является неявно развернутым необязательным, так как cell
существует, но myTextField
является nil
Сбой при попытке развернуть необязательный.
Если вы добавите ?
в myTextField
, все выражение становится необязательной цепочкой, которая приводит к nil
так как myTextField
является nil
, В этом случае он не падает, потому что дополнительная цепочка не пытается развернуть myTextField
,
Необязательная цепочка справа от присвоения не влияет на то, происходит ли присвоение или нет. Если дополнительная цепь на правой стороне =
ноль, то nil
будет назначен на левую сторону. Только левая сторона может отменить назначение, если это необязательная цепочка.