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 будет назначен на левую сторону. Только левая сторона может отменить назначение, если это необязательная цепочка.

Другие вопросы по тегам