Основы Swift / 4.3. Логические операторы


Видео


Логические операторы
Логические операторы изменяют или объединяют Булевы логические значения true и false. Swift поддерживает три базовых логических оператора:
  • Логическое НЕ (!a) или отрицание
  • Логическое И (a && b) или конъюнкция
  • Логическое ИЛИ (a || b) или дизъюнкция
Логическое отрицание
Оператор логического отрицания (!a) инвертирует Булево значение, так что true становится false, а false становится true.

Оператор логического отрицания - это префиксный оператор, и ставится он непосредственно перед операндом без пробелов. Он может быть прочитанным как "не a", что отражено в следующем примере:
@{4.3\1}
                    
let allowedEntry = false
if !allowedEntry {
    print("Доступ запрещён")
}
// Выведет "Доступ запрещён"
                    
                
Фраза if allowedEntry может быть прочитана как "если не разрешён вход". Следующая строка будет выполнена, только если утверждение "вход не разрешен" истинно; что будет верным, если allowedEntry ложно.

Осторожный выбор Булевых имён констант и переменных может помочь сделать Ваш код более читаемым и понятным, избегая двойных отрицаний или вводящих в ступор логических утверждений.
Оператор логического И
Оператор логического И (a && b) создаёт логическое выражение, где обе части обязаны быть истинными, чтобы всё выражение так же было истинным.

Если хотя бы одно значение ложно, всё выражение так же будет ложно. Фактически, если первое значение false, то второе выражение никогда не будет вычислено, потому что вне зависимости от его значения нельзя сделать всё выражение истинным. Это известно как вычисление по кратчайшей траектории.
@{4.3\2}
                    
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Добро пожаловать!")
} else {
    print("Доступ запрещён")
}
// Выведет "Доступ запрещён"
                    
                
Этот пример демонстрирует проверку двух Булевых значений и даёт доступ, только если оба они истинны:
Оператор логического ИЛИ
Оператор логического ИЛИ (a || b) - это инфиксный оператор, который состоит из двух символов вертикальной черты. Вы можете использовать его для создания логических выражений, где только одному значению достаточно быть true, чтобы всё выражение было верным.

Как и оператор логического И, оператор логического ИЛИ использует вычисление по кратчайшей траектории для определения своего значения. Если левая сторона выражения с логическим ИЛИ истинна, то правая сторона не будет вычислена, потому что не может изменить общий результат.
@{4.3\3}
                    
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Добро пожаловать!")
} else {
    print("Доступ запрещён")
}
// Печатает "Добро пожаловать!"
                    
                
В примере первое значение типа Bool (hasDoorKey) равно false, но второе значение (knowsOverridePassword) равно true. Так как одно значение равно true, то и всё выражение так же вычислится в true, и доступ будет разрешён.
Объединение логических операторов
Вы можете объединить несколько логических операторов для создания более длинного составного выражения:
@{4.3\4}
                    
let enteredDoorCode = true
let passedRetinaScan = false
let hasDoorKey = false
let knowsOverridePassword = true
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Добро пожаловать!")
} else {
    print("Доступ запрещён")
}
// Печатает "Добро пожаловать!"
                    
                
Этот пример использует несколько операторов && и || для создания составного выражения. Однако операторы && и || продолжают оперировать только двумя операндами, так что это просто три меньших выражения, связанных вместе. Этот пример может быть прочитан так:

"Если введём корректное значение дверного кода и пройдём сканирование сетчатки глаза или если у нас есть корректный ключ от двери, или если мы знаем специальный экстренный пароль, тогда будет дан доступ."

На основании значений enteredDoorCode, passedRetinaScan, hasDoorKey первые два подвыражения будут false. Однако известен аварийный пароль, так что всё составное выражение будет вычисляться в true.
Ассоциативность и прецедентность логических операторов
Логические операторы && и || в Swift левоассоциативные: составные выражения с множественными логическими операторами начинают вычисляться с левого крайнего выражения.
Явные скобки
Иногда бывает полезным поставить круглые скобки, даже если в них нет острой нужды, чтобы сделать понимание составного выражения более лёгким. В примере с доступом к двери, что дан выше, полезно добавить круглые скобки вокруг первой части составного выражения, чтобы упростить понимание:
@{4.3\5}
                    
let enteredDoorCode = true
let passedRetinaScan = false
let hasDoorKey = false
let knowsOverridePassword = true
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Добро пожаловать!")
} else {
    print("Доступ запрещён")
}
// Печатает "Добро пожаловать!"
                    
                
Круглые скобки делают более понятным тот факт, что первые два значения являются частью отдельного возможного утверждения в общей логике. Вывод составного выражения не изменится, но его понимание для читателя упростится. Читабельнсоть всегда предпочтительнее краткости: используйте круглые скобки там, где они могут помочь сделать понимание проще.