Неявно развернутые опции на самом деле (неудивительно), под капотом, опции!Единственным преимуществом IUO является то, что вам не нужно писать оператор !
(принудительное развертывание), компилятор сделает это за вас.
Это означает, что значения nil
являются приемлемыми значениями дляIUO годов.Вот почему MyCell.createFromNib()
разрешено присваивать myCell
, даже если функция может возвращать ноль при некоторых условиях.
С другой стороны, MyCell.createFromNib() as! MyCell
оценивается перед присвоением, а as!
всегда приводит к необязательному значению, если только оно не применяется к значению, которое не может быть приведено (ноль или другая иерархия).Таким образом, это не присвоение, которое завершается неудачей, а операция принудительного приведения, которая вызывает фатальную ошибку.
MyCell.createFromNib() as? MyCell
работала бы так же хорошо, с той разницей, что вместо сбоя это могло бы привести ктихая ошибка.Теперь вам решать, является ли это предпочтительным или нет.Я бы выбрал решение полу-сбой: сбой отладки, тихий сбой при выпуске.Таким образом, потенциальные проблемы могут быть обнаружены на этапе QA, однако, если они не будут обнаружены, они не приведут к аварийному завершению рабочего приложения.
let cell = MyCell.createFromNib()
assert(cell != nil, "Oops, something bad happened, please call the Avengers")
myCell = cell as? MyCell