Опционалы 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!Другие расширения