Swift. Извлечение опционального значения
Line 73: | Line 73: | ||
значение которого гарантированно инициализируется после создания экземпляра класса.<br> | значение которого гарантированно инициализируется после создания экземпляра класса.<br> | ||
Это позволяет не использовать принудительное извлечение и опциональное связывание. | Это позволяет не использовать принудительное извлечение и опциональное связывание. | ||
+ | |||
+ | ==Проверка наличия значения в опционале== | ||
+ | |||
+ | Проверка на nil: | ||
+ | <pre> | ||
+ | var a: Int? | ||
+ | var b: Int? = 32 | ||
+ | |||
+ | a != nil // false | ||
+ | b != nil // true | ||
+ | </pre> | ||
+ | |||
+ | Проверка и принудительное извлечение опционала в условии: | ||
+ | <pre> | ||
+ | var a: Int? = 8 | ||
+ | var b = 2 | ||
+ | |||
+ | if a != nil { | ||
+ | b += a! | ||
+ | } | ||
+ | |||
+ | b // 10 | ||
+ | </pre> | ||
+ | |||
+ | Проверка и косвенное извлечение опционала в условии: | ||
+ | <pre> | ||
+ | var a: Int! = 8 | ||
+ | var b = 2 | ||
+ | |||
+ | if a != nil { | ||
+ | b += a | ||
+ | } | ||
+ | |||
+ | b // 10 | ||
+ | </pre> | ||
Revision as of 14:34, 22 May 2022
Назад · Оглавление · Дальше
Contents |
Опционал и базовый тип
Нельзя проводить прямые операции между значениями опционального и базового типов:
var a: Int = 1 var b: Int? = 2 a + b // Ошибка: несоответствие типов
Способы извлечения опционального значения:
- принудительное
- косвенное
- опциональное связывание
- операция объединения с nil
Принудительное извлечение значения
Принудительное извлечение (force unwrapping):
var a: Int? = 12 var b = 34 var c = a! + b // 46 type(of: a!) // Int.Type type(of: c) // Int.Type
Принудительное извлечение строки:
var name: String? = "Иван" var s = "Name: " + name! s // "Name: Иван"
Попытка принудительного извлечения значения nil:
var name: String? var s = "Name: " + name! // Fatal error: Unexpectedly found nil
Принудительное извлечение допустимо при гарантированном наличии значения в опционале.
Косвенное извлечение значения
Косвенное извлечение опционального значения (implicitly unwrapping):
var a: Double! = 3.14 // знак ? заменяется на ! a + 0.12 // 3.26 type(of: a) // Optional<Double>.Type
Косвенное извлечение допустимо, если в момент проведения операции,
опционал гарантированно содержит значение (не nil).
Далее к параметру можно обращаться без принудительного извлечения, так как оно происходит автоматически.
При этом, принудительное извлечение остается возможным: a + a! + 0.12
Косвенное извлечение может быть полезно при использовании в классе опционального параметра,
значение которого гарантированно инициализируется после создания экземпляра класса.
Это позволяет не использовать принудительное извлечение и опциональное связывание.
Проверка наличия значения в опционале
Проверка на nil:
var a: Int? var b: Int? = 32 a != nil // false b != nil // true
Проверка и принудительное извлечение опционала в условии:
var a: Int? = 8 var b = 2 if a != nil { b += a! } b // 10
Проверка и косвенное извлечение опционала в условии:
var a: Int! = 8 var b = 2 if a != nil { b += a } b // 10
Назад · Оглавление · Дальше