Swift: неявно развернутая переменная работает, но не принудительно приводит ее к тому же типу.Зачем? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть MyCell, который является типом UIView.Я мог бы создать их, как показано ниже.

private let myCell: MyCell! = MyCell.createFromNib()
myCell.callingFunction()

Это показывает, что myCell не nil.Однако, если я хочу явно привести его, как показано ниже, и перезапустить тот же код (что означает, что myCell не будет nil, так как этот код ранее не был равен нулю)

private let myCell = MyCell.createFromNib() as! MyCell
myCell.callingFunction()

Itвылетит с ошибкой

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

Я думал, что это должно сработать.Чем они отличаются?

К вашему сведению, объявление функции createFromNib выглядит следующим образом

class func createFromNib<T: UIView>() -> T?

К вашему сведению, я новичок в iOS и Swift

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

private let myCell: MyCell!

Здесь myCell может содержать либо nil , либо значение типа MyCell Так что совершенно нормально назначить nil значение для этого.(Тем не менее, он выдаст ошибку, если вы используете его, когда его значение равно nil .)


private let myCell = MyCell.createFromNib() as! MyCell

Здесь вы пытаетесь преобразовать ноль для ввода MyCell, что определенно является ошибкой.


Примечание: Я думаю, MyCell.createFromNib() возвращает ноль в вашем кодедля обоих случаев.

0 голосов
/ 01 марта 2019

Неявно развернутые опции на самом деле (неудивительно), под капотом, опции!Единственным преимуществом 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
0 голосов
/ 01 марта 2019
  • В первом примере вы объявляете переменную как неявную развернутую необязательную , но вы только собираетесь записать - явно необязательный - результат createFromNibв эту переменную, которая может быть nil.

  • Во втором примере вы читаете результат createFromNib во время его приведения.Если это nil, то происходит сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...