Язык Swift часть 6. Optionals или опциональные типы данных
В языке Swift мы можем объявить переменную или константу без немедленного присвоения ей какого-то значения. Мы можем просто дать ей имя и анонсировать тип данных.
let message: String
let totalHight: Double
var points: Int
var maxValue: Int
Но если мы оставим все, как есть, мы не сможем использовать эти сущности в каких-либо вычислениях или проводить с ними какие-то операции. Потому что в Swift переменную или константу перед использованием необходимо инциализировать данными. Это важный момент.
Если мы все же попробуем это сделать, мы получим ошибку:
print(message) // Error! Constant 'message' used before being initialized
В языке Swift, переменные и константы не инициализируются автоматически значениями по умолчанию!
Во многих других языках программирования наоборот, существует автоматическое присвоение переменным и константам начальных значений. Но в дальнейшем при написании программы это может породить ряд трудно определяемых ошибок, и привести к непредсказуемым последствиям в ходе выполнения программы.
Компилятор языка Swift сканирует ваш код перед выполнением, чтобы убедиться, что где-то точно есть логика, отвечающая за инициализацию всех необходимых переменных, перед тем, как они будут использованы. И это хорошо.
Но как быть, если в нашей программе есть такие данные, которые исходя из логики программы могут существовать, а могут и нет?
Разберем кусочек кода, который описывает данные персонажа в ролевой игре:
// Character characteristics:
var fraction: String
var race: String
var firstName: String
var middleName: String
var lastName: String
var age: Int
var adress: String
Персонаж определенно будет принадлежать одной из существующих расс, наверняка у него будет имя и возраст. Возможно даже адресс. Но у него может не быть отчества или фамилии, он может не принадлежать ни к какой фракции.
Можно предположить, что если у персонажа нет каких-либо данных, просто присвоим этим данным nil
, 0
, или пустой String
. Но это не совсем верно. Если у персонажа нет фамилии, получается что у него будет фамилия равная "" пустой строке.""
Так, как Swift безопасный язык, в нем предусмотрена фича, которая если не устраняет, то решает описанную выше проблему.
И это - Optionals
. Или опциональный тип данных в языке Swift.
Optionals подскажет нам, как объявить типо-безопасные значения, когда данная переменная может и не существовать вовсе.
Опциональными могут быть любые существующие типы данных.
Чтобы объявить опциональный тип данных достаточно просто поставить после него знак вопроса ?
.
// Character characteristics:
var fraction: String?
var race: String
var firstName: String
var middleName: String?
var lastName: String?
var age: Int
var adress: String?
Опционалы тоже типо-безопасны. Им свойственно все то, что характерно для обычных типов данных. Переменная, определенная как опциональная - может вообще не существовать, не иметь значения. Но переменная с типом Int?
либо имеет значение типа Int
либо не имеет значения вовсе. Нельзя потом передать ей Bool
или String
.
Если переменная опциональная и не объявлена - она имеет значение nil
. nil
является важным ключевым словом в языке Swift.
nil эквивалентно - no value (нет значения)
Но так же важно понимать, что nil
не означает что переменная не инициализирована. Это НЕ является значением по умолчанию. nil
означает что что-то определено опциональным типом. Обычные переменные и константы не могут быть равны nil
.
В языке программирования Swift, опциональные типы данных являются обыденной необходимостью. У вас просто не останется выбора, использовать их или нет? Любая программа чуть сложнее Hello World!
на Swift содержит опционалы.
На этом окончим краткое знакомство с опционалами, но обязательно вернемся к ним позднее. Там можно много чего обсудить.