Swift. Опциональное связывание
Назад · Оглавление · Дальше
Опциональное связывание (optional binding) - извлечение значения (если не nil),
и его присвоение во временный параметр:
var userName: String? if let name = userName { // name - связанный параметр print("Имя: \(name)") } else { print("Имя не введено") } type(of: userName) // Optional<String>.Type Консоль: Имя не введено
Если значение опционала userName не nil, то оно передается связанному параметру name.
Пример опционального связывания:
var a: Int? = 5 var b = 5 if let n = a { b += n } b // 10
Опциональное связывание можно применить для нескольких опционалов:
var pointX: Int? = 10 var pointY: Int? = 15 if let x = pointX, let y = pointY { print("Координаты точки: (\(x), \(y))") } Консоль: Координаты точки: (10, 15)
Опциональное связывание нескольких опционалов возвращает false, если значение одного из них равно nil.
Если опциональное значение требуется проверить на nil, без использования в теле условия,
то вместо связанного параметра можно указать знак нижнего подчеркивания:
var pointX: Int? = 10 var pointY: Int? = 15 if let _ = pointX, let _ = pointY { print("Точка установлена на плоскости") } Консоль: Точка установлена на плоскости
Связанный параметр можно использовать в условном выражении:
var pointX: Int? = 10 var pointY: Int? = 15 if let x = pointX, x > 5 { print("Точка за пределами установленной границы") } Консоль: Точка за пределами установленной границы
Примеры
Использование опционалов без связанных параметров:
var a: Int? = 8 var b: Int? = 2 if let _ = a, let _ = b { b! += a! } b // 10
Использование связанных параметров в условном выражении:
var a: Int? = 8 var b: Int? = 2 if let n = a, let m = b, n > m { b = n + m } b // 10
Опциональное связывание и оптимизация кода
Добавление монет в хранилище:
var coinsInNewChest = "120" var allCoinsCount = 1725 if Int(coinsInNewChest) != nil { allCoinsCount += Int(coinsInNewChest)! } else { print("У нового участника отсутствуют монеты") } allCoinsCount // 1845
Строковое значение coinsInNewChest ориентировано на соответствующее текстовое поле приложения.
Кроме того, сундук может отсутствовать:
- значение 0 будет утверждать наличие пустого сундука
- значение "" подтверждает отсутствие сундука
Проблема в том, что Int(coinsInNewChest) используется дважды:
- при сравнении с nil
- при сложении с переменной allCoinsCount
Добавим в код переменную coins:
var coinsInNewChest = "120" var allCoinsCount = 1725 var coins = Int(coinsInNewChest) if coins != nil { allCoinsCount += coins! } else { print("У нового участника отсутствуют монеты") } allCoinsCount // 1845
После завершения работы оператора if, переменная coins останется в памяти, хотя в ней нет необходимости.
Для решения проблемы используем опциональное связывание:
var coinsInNewChest = "120" var allCoinsCount = 1725 if let coins = Int(coinsInNewChest) { allCoinsCount += coins } else { print("У нового участника отсутствуют монеты") } allCoinsCount // 1845
После выполнения оператора if, связанный параметр coins будет автоматически удален.
Назад · Оглавление · Дальше