Язык 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 содержит опционалы.

На этом окончим краткое знакомство с опционалами, но обязательно вернемся к ним позднее. Там можно много чего обсудить.