В чем смысл использования неявно развернутого необязательного в этом примере?

Это из документа, раздел Failable Initializers для классов :

class Product { let name: String! init?(name: String) { self.name = name if name.isEmpty { return nil } } } if let bowTie = Product(name: "") { // no need to check if bowTie.name == nil print("The product's name is \(bowTie.name)") } 

Это описано как:

В приведенном выше примере свойство name класса Product определяется как имеющий неявно развернутый необязательный тип строки (String!). Поскольку это необязательный тип, это означает, что свойство name имеет значение по умолчанию nil, прежде чем ему назначается определенное значение во время инициализации. Это значение по умолчанию nil в свою очередь означает, что все свойства, введенные классом Product, имеют действительное начальное значение. В результате неудачный инициализатор для продукта может инициировать сбой инициализации в начале инициализатора, если ему передается пустая строка, прежде чем назначать определенное значение для свойства name в инициализаторе.

Взгляните на последнее предложение:

В результате неудачный инициализатор для продукта может инициировать сбой инициализации в начале инициализатора, если ему передается пустая строка, прежде чем назначать определенное значение для свойства name в инициализаторе.

Это не видно из предоставленного кода. В предоставленном коде можно видеть, что назначение произошло перед return nil частью return nil , и либо String (не факультативно), либо String? (необязательно) будет работать.

Другое дело, что в приведенном примере нет смысла использовать неявно развернутую опцию, если она определена как константа. Константы должны быть инициализированы до значений по умолчанию перед завершением init.

Любые мысли об этом, или кто-нибудь видит причину не сообщать об этом радару? Может, я что-то упустил? У меня есть идея на самом деле, почему неявно разворачивается опционально, используемая здесь, но это плохой пример. Для меня это имеет смысл:

 class Product { var name: String! //let is changed to var init?(name: String) { if name.isEmpty { return nil } //Check here if passed value is non-empty self.name = name } } 

Таким образом, сбой инициализации может быть инициирован перед любым присваиванием name .

Все ваши опасения по поводу вводящей в заблуждение документации являются правильными.

Кроме того, обратите внимание, что в Swift 2.2, возвращающемся с раннего выхода из инициализатора с ошибкой , работает даже до того, как все свойства будут инициализированы:

 class Product { let name: String init?(name: String) { if name.isEmpty { return nil } self.name = name } } 

Другое изменение заключается в том, что deinit больше не вызывается при возврате nil из failable initializer.

Из Xcode 7.3 beta 2 Примечания к выпуску :

Внутри класса назначенный инициализатор, который является либо failable ( init?() ), Либо throwing ( init() throws ), может выйти до инициализации всех сохраненных свойств и вызова super.init() . Такое поведение поддерживается, что делает назначенные инициализаторы более согласованными с инициализаторами удобства. Инициализаторы удобства также могут потерпеть неудачу перед выполнением self.init() .

  • iOS - анимация флип-карты
  • Как установить максимальное время UIDatePickerModeCountDownTimer?
  • почему invalidateLayout не запускает sizeForItemAtIndexPath в UICollectionView? (код прилагается)
  • Быстрое извлечение изображения из Parse sdk - получение сбоя
  • Как отправить и настроить APN Auth Key (файл .p8) в VB.Net
  • Используйте функцию С в Swift
  • Ошибки со статическими таблицами
  • Десятичное двойное преобразование в Swift 3
  • Как добавить границу к круговому изображению с маской
  • Неявно развернуто необязательное назначение в Xcode 8
  • firebase извлекает удаленные данные из базы данных
  • Interesting Posts

    Создание переменных экземпляра во время выполнения

    Установка старой версии через TestFlight

    iPad-приложение разбилось из-за предупреждения о памяти при объединении / слиянии двух изображений

    Я должен обновлять фрейм всего в раскадровке каждый раз, когда я запускаю Xcode

    Ошибка компилятора Framework BlocksKit

    Как получить ориентацию по умолчанию LandscapeLeft в iOS5?

    Каков наиболее эффективный способ отображения CVImageBufferRef на iOS

    Swift читать userInfo удаленного уведомления

    Как добавить две или более кнопки в annotationView: MKAnnotationView?

    xcassets: значок приложения XXxXX требуется для приложений iPhone, предназначенных для выпусков iOS до 7.0

    Кто-нибудь знает, почему это исключение бросается в ios / cordova?

    Как изменить текст в NSLocationUsageDescription

    Отобразить просматриваемый вид из AppDelegate на основе поискового запроса Core Spotlight

    Swift и Xcode – Как создать пользовательские значки панели вкладок

    одновременное нажатие кнопок

    Давайте будем гением компьютера.