Основы Swift / 4.1. Условный код


Видео


Условные инструкции
Часто бывает полезным выполнить разные части кода в зависимости от определённых условий. Вы можете захотеть выполнить дополнительный участок кода, когда произойдёт ошибка или когда нужно отобразить сообщение о том, что значение стало слишком большим или слишком маленьким. Чтобы сделать это, Вы делаете части своего кода условными.

В своей простейшей форме инструкция if имеет единственное if-условие. Она выполняет набор инструкций, только если условие истинно. Результат вычисления условия имеет тип Bool.
@{4.1\1}
                    
var temperatureInFahrenheit = 30
if temperatureInFahrenheit <= 32 {
    print("Это очень холодно. Советуем надеть шарф.")
}
// Выведет "Это очень холодно. Советуем надеть шарф."
                    
                
В этом примере происходит проверка того, меньше ли или равна температура 32 градусам по Фаренгейту (точка замерзания воды). Если это так, то будет напечатано сообщение. В противном случае никакого сообщения не будет выведено, а выполнение кода продолжится после закрывающей фигурной скобки инструкции if.
Блок else
Инструкция if может предоставить альтернативный набор инструкций, известный как блок else, для ситуаций, когда условие if равно false. Эти инструкции отделяются ключевым словом else:
@{4.1\2}
                    
var temperatureInFahrenheit = 40
if temperatureInFahrenheit <= 32 {
    print("Это очень холодно. Советуем надеть шарф.")
} else {
    print("Это не так холодно. Наденьте футболку.")
}
// Выведет "Это не так холодно. Наденьте футболку."
                    
                
Одна из этих веток всегда будет выполнена. Под ветвями инструкции if понимаются различные блоки if; if-else; else. Также отдельно взятую ветвь можно считать телом инструкции if. Так как температура возросла до 40 градусов по Фаренгейту, то больше недостаточно холодно, чтобы советовать носить шарф, так что вместо этого сработает ветка else.
Цепочка из условий if
Вы можете объединить в цепочку несколько инструкций if для задания дополнительных блоков.
@{4.1\3}
                    
var temperatureInFahrenheit = 90
if temperatureInFahrenheit <= 32 {
    print("Это очень холодно. Советуем надеть шарф.")
} else if temperatureInFahrenheit >= 86 {
    print("По-настоящему жарко. Не забудьте надеть солнцезащитные очки.")
} else {
    print("Это не так холодно. Наденьте футболку.")
}
// Выведет "По-настоящему жарко. Не забудьте надеть солнцезащитные очки."
                    
                
Здесь дополнительная инструкция if добавлена, чтобы отвечать за конкретную температуру жары. Финальный блок остаётся, и он выведет ответ на любые температуры, которые нельзя считать слишком жаркими или слишком холодными.
else необязателен
Однако последний блок else необязателен и может быть опущен, если набор условий не имеет необходимости быть завершённым.
@{4.1\4}
                    
var temperatureInFahrenheit = 72
if temperatureInFahrenheit <= 32 {
    print("Это очень холодно. Советуем надеть шарф.")
} else if temperatureInFahrenheit >= 86 {
    print("По-настоящему жарко. Не забудьте надеть солнцезащитные очки.")
}
                    
                
Булевы значения в инструкциях if
Типобезопасность Swift препятствует небулевым значениям быть заменёнными на Bool. Следующий пример выдаст ошибку времени компиляции:
@{4.1\5}
                        
let i = 1
if i {
    // не скомпилируется, так как i не является логический величиной
}
                        
                    
Во многих других бы языках программирования этот пример бы сработал, так как всё, что не нуль, трактуется в них как истина. Это связано с тем, что для удобства лжи ставится в соответствие 0, а истине - 1, что неверно для Swift.
@{4.1\6}
                        
let i = 1
if i == 1 {
    print("Я есть грут")
}
// Выведет "Я есть грут"
                        
                    
А вот этот пример сработает корректно. Так как используется оператор эквивалентности (==), чьё возвращаемое значение будет Булевым.

Как и другие примеры типобезопасности в Swift, этот подход позволяет избежать случайных ошибок и предполагает понятность отдельной секции кода.
Оператор присваивания в инструкциях if
Операторы присваивания (включая составные) в Swift не возвращают значения. Эта возможность препятствует оператору присваивания (=) быть случайно использованным в случае, когда должен был быть применён оператор равенства (==). Делая if x = y некорректной инструкцией, Swift помогает избежать эти типы ошибок.

Следующая запись некорректна:
@{4.1\7}
                    
let x = 0, y = 1
if x = y {
    print("Эта ветка никогда не будет достигнута")
}
                    
                
Операторы сравнения в if
Операторы сравнения часто используются в условных выражениях, таких как, например, if:
@{4.1\8}
                    
let name = "Неймар"
if name == "Неймар" {
    print("Здравствуй, Неймар!")
} else {
    print("Я сожалею, \(name), но я не распознаю Вас.")
}
// Выведет "Здравствуй, Неймар!", так как name равен "Неймар"
                    
                
Здесь константе name задаётся значение строки "Неймар", а так как она равна строке из условия if, то будет выведено "Здравствуй, Неймар!".
Сравнение кортежей
Вы можете также сравнить кортежи одинаковой размерности, если все значения в кортежах сравнимы. Например, и Int, и String могут быть подвергнуты сравнению, что значит, что кортежи типа (Int, String) могут быть сравнены. Напротив, значения типа Bool нельзя сравнить, как следствие кортежи с Булевыми значениями сравнить нельзя.

Кортежи сравниваются слева направо, по одному значению за раз, до тех пор, пока два значения не окажутся неравными. Эти два значения будут подвергнуты сравнению, и результат будет определять итоговый результат сравнения кортежей. Если все элементы равны, то и кортежи тоже равны. Например:
@[4.1\9}

(1, "zebra") < (2, "apple")   // true, так как 1 меньше 2; а "apple" и "zebra" не сравнивались
(3, "apple") < (3, "bird")    // true , так как 3 равно 3, а "apple" меньше чем "bird"
(4, "dog") == (4, "dog")      // true , так как 4 равно 4, и "dog" равен "dog"
                    
Так как 1 меньше 2, то (1, "zebra") определённо меньше, чем (2, "apple"), независимо от любых других значений в кортежах. Неважно, что "zebra" не меньше, чем "apple", так как сравнение уже определено первыми элементами кортежей. Однако, когда первые элементы кортежей одинаковы, их вторые элементы сравниваются - это то, что происходит на второй и третьей строках. Про сравнение строк будет рассказано позднее.