Прежде чем погрузиться в тему, давайте освежим наши знания. Чтобы понять ImplicitlyUnwrappedOptional a.k.a. IUO, вы должны знать, что такое Необязательныепеременные. Если вы уже имеете представление о том, что такое Необязательные переменные , вы можете ознакомиться с моим предыдущим сообщением о Необязательных ссылках ниже.



Давайте начнем…
Swift обладает возможностями безопасности типов, а необязательные переменные являются одним из способов сделать Swift type safe.
В Swift Optional имеет два типа:

  1. Необязательно
  2. Неявноразвернутый, необязательный

В этом посте мы сосредоточимся на ImplicitlyUnwrappedOptional(IUO). Вам интересно узнать, что это за IUO?

Как вы уже знаете, когда мы объявляем переменную или константу как необязательную, это означает, что переменная или константа не может иметь «никакого значения». Итак, нам нужна проверка, чтобы развернуть Необязательный, чтобы использовать значение, хранящееся в этом. Как вы можете видеть ниже в коде:

var someOptionalString: String? 
if someOptionalString != nil {    
   print("someOptionalString = \(someOptionalString!)")
} else {
    print("someOptionalString is nil")
}

Это приводит к накладным расходам на проверку Optional, прежде чем можно будет использовать его значение каждый раз в программе. Но если мы знаем, что Optional всегда будет иметь значение, то какой смысл в этих накладных расходах.

Чтобы устранить эти накладные расходы, у нас есть ImplicitlyUnwrappedOptional, потому что он позволяет вам получить доступ к необязательным значениям, не разворачивая их каждый раз.
Он имеет специальный синтаксис с ! в конце типа вместо ? используется внеобязательно:

var assumedString: String! = "Some assumed string"
print(assumedString) // Some assumed string

Вы можете подумать, что того же можно добиться с помощью переменной Non-Optional String. Какой смысл вводить еще одну ошеломляющую концепцию?

Итак, чтобы понять это, давайте рассмотрим другой пример, также называемый шаблон отложенной инициализации:

struct S {
  var x: Int!
  init() {}
  func initLater(x someX: Int) {
     x = someX
  }
}

Здесь мы используем x как ImplicitlyUnwrappedOptional, потому что мы не хотим иметь накладные расходы на разворачивание x каждый раз, когда мы обращаемся это свойство. Но из кода видно, что мы не знаем значение x во время объявления, но уверены, что оно будет содержать значение позже в программе, до того, как мы получим это значение. из х. В этом случае использование необязательных переменных недопустимо, так как мы не знаем значение x во время объявления. Это один из вариантов использования, почему вводится ImplicitlyUnwrappedOptional, поскольку мы не можем установить для non optionalзначениеноль.

Справедливо. Но вместе с этим преимуществом приходит и другой недостаток. Давайте рассмотрим следующий пример:

func f(i: Int) -> Int! {
    return (i > 0) ? i : nil
}
let a = f(i: 0)
print(a) // crash! as 'a' is nil

Еще одна большая проблема. Как это решить?
Swift 3.x поставляется с волшебством, которое избавит вас от этой проблемы (которую вы должны понять), чтобы лучше использовать ImplicitlyUnwrappedOptional.

Это основная часть этого поста.

В Swift 3.x для приведенного выше кода компилятор Swift покажет вам некоторые предупреждения.

Это связано с повышенной безопасностью типов. Swift 3.x неявно возвращает обычный Optional из функции, которая, как ожидается, вернет ImplicitlyUnwrappedOptional, если только мы явно не объявим, что нам нужен ImplicitlyUnwrappedOptional.

На приведенном выше снимке экрана видно, что тип a — это Optional‹Int› вместо ожидаемого ImplicitlyUnwrappedOptional‹Int›.

Это одно из самых больших изменений в реализации ImplicitlyUnwrappedOptional.

Теперь вывод типов больше не является небезопасным, пока мы явно не захотим сделать его небезопасным.

Теперь a — это ImplicitlyUnwrappedOptional‹Int›, а c — это Optional‹Int›, что избавляет нас от случайного внедрения unsafeImplicitlyUnwrappedOptional в наш код.

Примечание. Это помогает Swift взаимодействовать с API, для которых допустимость значений NULL имеет смысл или тип возвращаемого значения неизвестен, в основном
с API Objective-C.

Редактировать: Забудьте поделиться этой важной информацией о том, как Крис Уиллмор предложил это новое изменение в отношении ImplicitlyUnwrappedOptional.

Если вам понравился пост, нажмите кнопку ❤️ и расскажите о нем.

Комментарий ниже, чтобы оставить свой отзыв и помочь мне улучшить содержание.