Опционалы Swift

Опциональный тип (Optional) в Swift используется для обработки отсутствующих значений. Optional означает «есть значение, и оно равно x» или «значения нет».

Язык Swift определяет суффикс ? как сокращение для именованного типа Optional. Иными словами, следующие два объявления эквивалентны:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

В обоих случаях переменная optionalInteger имеет опциональный целочисленный тип. Обратите внимание, что между типом и?нет пробела.

Optional — это перечисление с двумя случаями, None и Some(T), используемое для представления значения, которое может существовать или не существовать. Любой тип можно явно объявить (или неявно преобразовать) как optional-тип. При объявлении optional-типа обязательно используйте круглые скобки, чтобы задать оператору ? правильную область действия. Например, чтобы объявить optional-массив целых чисел, следует написать (Int[])?; запись Int[]? вызовет ошибку.

Если вы объявляете optional-переменную или optional-свойство без предоставления начального значения, его значение по умолчанию равно nil.

Optional-типы соответствуют протоколу LogicValue, поэтому они могут использоваться в булевом контексте. В этом случае, если optional-тип T? содержит любое значение типа T (то есть его значение равно Optional.Some(T)), то optional равен true; в противном случае он равен false.

Если экземпляр optional-типа содержит значение, вы можете использовать постфиксный оператор ! для доступа к этому значению, как показано ниже:

optionalInteger = 42
optionalInteger! // 42

Использование оператора ! для доступа к optional-переменной, значение которой равно nil, вызовет ошибку времени выполнения.

Вы можете использовать опциональное связывание и опциональную привязку, чтобы выборочно выполнять операции над optional-выражениями. Если значение равно nil, операция не выполняется, и ошибки времени выполнения не возникает.

Давайте подробно рассмотрим следующие примеры, чтобы понять применение optional-типов в Swift:

import Cocoa

var myString:String? = nil

if myString != nil {
    print(myString)
}else{
    print("字符串为 nil")
}

Вывод вышеприведённой программы:

字符串为 nil

Optional-типы похожи на значение nil указателей в Objective-C, но nil полезен только для классов, тогда как optional-типы доступны для всех типов и безопаснее.


Принудительная распаковка

Когда вы уверены, что optional-тип действительно содержит значение, вы можете добавить восклицательный знак (!) после имени optional, чтобы получить доступ к значению. Этот восклицательный знак означает «Я знаю, что этот optional имеет значение, пожалуйста, используйте его». Это называется принудительной распаковкой optional-значения.

Пример ниже:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值为 nil")
}

Вывод вышеприведённой программы:

Optional("Hello, Swift!")

Принудительная распаковка optional-значения с помощью восклицательного знака (!):

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if myString != nil {
   // 强制解析
   print( myString! )
}else{
   print("myString 值为 nil")
}

Вывод вышеприведённой программы:

Hello, Swift!

Примечание:
Использование!доступ к несуществующему опциональному значению вызовет ошибку во время выполнения. Используя!перед принудительным развёртыванием значения убедитесь, что опционал содержит не-nilзначение.


Автоматическое развёртывание

Вы можете использовать восклицательный знак (!) вместо вопросительного знака (?) при объявлении опциональной переменной. В этом случае опциональной переменной не нужно добавлять восклицательный знак (!) для доступа к значению при использовании; она будет развёрнута автоматически.

Пример ниже:

import Cocoa

var myString:String!

myString = "Hello, Swift!"

if myString != nil {
   print(myString)
}else{
   print("myString 值为 nil")
}

Вывод вышеприведённой программы:

Hello, Swift!

Опциональная привязка

Используйте опциональную привязку, чтобы определить, содержит ли опциональный тип значение. Если он содержит значение, присвойте это значение временной константе или переменной. Опциональную привязку можно использовать в инструкциях if и while для проверки значения опционального типа и присваивания значения константе или переменной.

Запишите опциональную привязку в инструкции if следующим образом:

if let constantName = someOptional {
    statements
}

Давайте рассмотрим простой пример опциональной привязки:

import Cocoa

var myString:String?

myString = "Hello, Swift!"

if let yourString = myString {
   print("你的字符串值为 - \(yourString)")
}else{
   print("你的字符串没有值")
}

Вывод вышеприведённой программы:

你的字符串值为 - Hello, Swift!
Другие расширения