Optional — это специальный тип в Swift, который указывает, что значение может либо существовать (не быть nil), либо отсутствовать (быть nil). Это фундаментальная особенность Swift, обеспечивающая безопасность работы с отсутствующими значениями.
Optional представляется с помощью символа ?
после типа:
var name: String? = "Alice" // Может содержать String или nil
var age: Int? = nil // Явное отсутствие значения
Optional — это enum с двумя кейсами:
enum Optional<Wrapped> {
case none // Нет значения (nil)
case some(Wrapped) // Есть значение
}
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber) // Int?
if convertedNumber != nil {
print("Number is \(convertedNumber!)") // ! для принудительного извлечения
}
Опасность: Принудительное извлечение nil вызывает runtime crash.
if let actualNumber = Int(possibleNumber) {
print("Number is \(actualNumber)") // actualNumber уже извлечен
} else {
print("Could not convert")
}
func processNumber(_ input: String) {
guard let number = Int(input) else {
print("Invalid input")
return
}
// number доступен здесь как Int (не Optional)
print("Processing number \(number)")
}
let userInput: String? = nil
let username = userInput ?? "Anonymous" // "Anonymous" если userInput nil
class Person {
var residence: Residence?
}
class Residence {
var address: Address?
}
class Address {
var streetName: String?
}
let john = Person()
let street = john.residence?.address?.streetName // String?
?
и !
— это синтаксический сахар над enum OptionalAPI, которые могут вернуть nil:
let index = array.firstIndex(of: element) // Int?
Поля моделей данных:
struct User {
var email: String?
var phone: String?
}
Результаты преобразований:
let number = Int("123a") // nil
?
— объявление опционала!
— принудительное извлечение (опасно)if let
/guard let
— безопасное извлечение??
— значение по умолчанию?.
— опциональная цепочкаOptional — одна из ключевых особенностей Swift, которая значительно повышает безопасность кода и помогает избежать многих распространенных ошибок.