Что такое "Опционалы"

Перечисление 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