Swift. Опциональное связывание

From AsIsWiki
Revision as of 15:08, 22 May 2022 by Alex (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Назад · Оглавление · Дальше


Опциональное связывание (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 будет автоматически удален.



Назад · Оглавление · Дальше

Personal tools
Namespaces

Variants
Actions
Navigation
Tools