Что такое "Опционалы"
Перечисление Optional<Wrapped>
c двумя кейсами: .some(Wrapped)
и .none
:
@frozen
public enum Optional<Wrapped>: ExpressibleByNilLiteral {
case none
case some(Wrapped)
}
Тип данных, который предоставляет обернутое значение или nil
| .none
, отсутствие значения. Иными словами, значение может быть или не может. Можно записать как Optional<Int>
, но предпочтительна более коротка форма Int?
:
let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
let number: Int? = Optional.some(42)
let noNumber: Int? = Optional.none
print(noNumber == nil) // true
Развернуть (получить) значение можно с помощью:
Optional Binding
(if let, guard let, switch)
if let starPath = imagePaths["star"] {
print("The star image is at '\(starPath)'")
} else {
print("Couldn't find the star image")
}
Optional Chaining
используя опциональный постфикс оператор (postfix ?)
if imagePaths["star"]?.hasSuffix(".png") == true {
print("The star image is in PNG format")
}
Nil-Coalescing Operator ??
, предоставляя дефолтное значение
let defaultImagePath = "/images/default.png"
let heartPath = imagePaths["heart"] ?? defaultImagePath
print(heartPath)
Unconditional (Force) Unwrapping !
let number = Int("42")!
// или c помощью проперти let number = Int("42").unsafelyUnwrapped
print(number)
⚠️ Принудительная развертка выражения со значением nil
приведет к runtime error
.
Oct. 14, 2023, Источник
Опционалы — это особенность языка, позволяющая обрабатывать ситуации, когда значение может отсутствовать. Может содержать либо значение соответствующего типа, либо `nil`, указывая на отсутствие значения. Это позволяет безопасно работать с данными, которые могут быть не предоставлены, избегая при этом ошибок выполнения, связанных с обращением к переменным, не имеющим фактического значения.
Их использование помогает предотвратить ситуации, когда программа пытается обратиться к значению, которое не было задано, что может привести к сбою программы. Они требуют явного развертывания для доступа к их содержимому, что заставляет осознанно обрабатывать случаи, когда значение отсутствует.
Пример:
```swift
var optionalInt: Int? = nil
```
В этом случае переменная `optionalInt` объявлена как опциональная `Int`. Изначально она не содержит значения, что обозначается как `nil`.
Предлагается несколько способов работы с опционалами, включая:
1. Принудительное развертывание: Использование восклицательного знака (`!`) для доступа к значению опционала. Этот метод опасен, так как может привести к ошибке времени выполнения, если опционал содержит `nil`.
```swift
let someValue: Int? = 5
let unwrappedValue: Int = someValue! // Принудительное развертывание
```
2. Опциональное связывание: Позволяет безопасно проверить и извлечь значение опционала, если оно существует.
```swift
if let unwrappedValue = someValue {
print(unwrappedValue) // Безопасное использование unwrappedValue
}
```
3. Оператор объединения с nil (nil-coalescing operator): Позволяет предоставить значение по умолчанию для опционала в случае, если в нем содержится `nil`.
```swift
let defaultValue = someValue ?? 0 // Использует 0, если someValue содержит nil
```
Использование опционалов является ключевым для обеспечения безопасности типов и предотвращения распространенных ошибок, связанных с обращением к неинициализированным или отсутствующим значениям.
April 10, 2024, easyoffer