Урок 1.5 Управление потоком

Урок 1.5 Управление потоком

На уроке “Введение в Swift и песочницы” вы узнали, что программа Swift записывается в файл .swift, который выполняется сверху вниз. Вы сами видели это, когда работали с файлами playground. Но большие приложения не так просты.

Они не помещаются в один файл и обычно не запускают каждую строку кода сверху вниз.

Вы будете писать код, который принимает решения о том, какие строки кода должны быть выполнены, в зависимости от результатов ранее выполненного кода. Это называется управление потоком.

В этом уроке вы узнаете, как использовать логические операторы для проверки условий и использовать инструкции управления потоком (if, if-else и switch), чтобы выбрать, какой код будет выполняться в результате.


Чему Вы Научитесь

  • Как использовать операторы if и else для управления тем, какой код выполняется
  • Как использовать логические операторы NOT (!), AND (&&) и OR (||), чтобы проверить, является ли что-то истинным или ложным
  • Как использовать оператор switch для управления тем, какой код выполняется
  • Как использовать троичный условный оператор (?:) для условного присвоения различных значений константе или переменной

Терминология


Связанные ресурсы

Руководство по языку программирования Swift: Управление потоком

 

Подумайте о приложении, которое вы используете, которое требует от вас входа в систему. Если вы запускаете приложение и уже вошли в систему, приложение отображает ваши данные. Если вы не вошли в систему, приложение запросит ваши учетные данные для входа. Если вы введете правильное имя пользователя и пароль, вы войдете в систему, и приложение отобразит ваши данные. Если вы вводите неправильные учетные данные, вам будет предложено ввести правильную информацию.

В этом примере описывается одно распространенное взаимодействие, которое требует многократных проверок и выполнения кода на основе результатов.

Эти проверки называются условными операторами, и они являются частью более широкой концепции, называемой управлением потоком. Как у разработчика, у вас есть инструменты управления потоком, которые проверяют наличие определенных условий и выполняют различные блоки кода на основе этих условий.

В зависимости от результата выполнения набора условий вы можете использовать различные инструкции для управления тем, какой код выполняется. Все эти условные операторы являются примерами управления потоком.

Логические операторы и операторы сравнения

Каждый оператор if использует логический оператор или оператор сравнения, чтобы решить, является ли что-то истинным или ложным. Результат определяет, следует ли запускать блок кода или пропустить его.

Вот список наиболее распространенных логических операторов и операторов сравнения:

Оператор Тип Описание
== Сравнение Два элемента должны быть равны
!= Сравнение Значения не должны быть равны друг другу
> Сравнение Значение слева должно быть больше значения справа
>= Сравнение Значение слева должно быть больше или равно значению справа
< Сравнение Значение слева должно быть меньше значения справа
<= Сравнение Значение слева должно быть меньше или равно значению справа
&& Логический И - условный оператор слева и справа должны быть true
|| Логический ИЛИ - условный оператор слева или справа должны быть true
! Логический НЕ - возвращает логическую противоположность условному оператору, непосредственно следующему за оператором

Вы можете смешивать и сопоставлять операторы для создания логического значения или Bool. Логические значения имеют значение true или false, и вы можете объединить их с оператором if, чтобы определить, следует ли запускать код или пропускать его.

if инструкция

Наиболее простым условным оператором является оператор if. Оператор if говорит, что “Если это условие истинно, то запустите этот блок кода”. Если условие неверно, программа пропускает блок кода.

В большинстве случаев вы будете использовать оператор if для проверки простых условий с несколькими возможными результатами. Вот пример:

 

let temperature = 100
if temperature >= 100 {
  print(”The water is boiling.”)
}


Console Output:

The water is boiling.

 

Константа temperature равна 100, и оператор if выводит текст, если temperature больше или равна 100. Поскольку оператор if принимает значение true, выполняется блок кода, сопровождающий оператор if.

if-else инструкция

Вы только что узнали, что оператор if запускает блок кода, если условие истинно. Но что, если это условие ложно? Добавив else к оператору if, вы можете указать блок кода, который будет выполняться, если условие ложно:

 

let temperature = 100
if temperature >= 100 {
  print(”The water is boiling.”)
} else {
  print(”The water is not boiling.”)
}

 

Вы можете развить эту идею еще дальше. Используя else if, вы можете объявить больше блоков кода для выполнения на основе любого количества условий. Следующий код проверяет положение спортсмена в гонке и реагирует соответствующим образом:

 

var finishPosition = 2
 
if finishPosition == 1 {
  print(”Congratulations, you won the gold medal!”)
} else if finishPosition == 2 {
  print(”You came in second place, you won a silver medal!”)
} else {
  print(”You did not win a gold or silver medal.”)
}

 

Вы можете использовать множество операторов else if для учета любого количества потенциальных случаев. 

Логические значения

Вы можете присвоить результаты логического сравнения константе или переменной Bool, чтобы проверить или получить доступ к значению позже. Значения Bool могут быть только true или false.

В следующем коде оператор Bool определяет, что число не квалифицируется как isSmallNumber:

 

let number = 1000
let isSmallNumber = number < 10
// число не меньше 10, поэтому малому числу присваивается значение "false".

 

И где оператор Bool определяет, что currentSpeed действительно квалифицируется как isSpeeding.

 

let speedLimit = 65
let currentSpeed = 72
let isSpeeding = currentSpeed > speedLimit
// текущая скорость currentSpeed превышает ограничение скорости speedLimit, поэтому
превышению скорости isSpeeding присваивается значение `true`.

 

Также можно инвертировать значение Bool с помощью логического оператора NOT, который представлен символом !.

 

var isSnowing = false
 
if !isSnowing {
  print(”It is not snowing.”)
}


Console Output:
It is not snowing.

 

Таким же образом вы можете использовать логический оператор И, представленный &&, чтобы проверить, верны ли два или более условий.

 

let temperature = 70
 
if temperature >= 65 && temperature <= 75 {
  print(”The temperature is just right.”)
} else if temperature < 65 {
  print(”It is too cold.”)
} else {
  print(”It is too hot.”)
}


Console Output:
The temperature is just right.

 

В приведенном выше коде температура соответствует обоим условиям: она больше или равна 65 градусам и меньше или равна 75 градусам. Это как раз то, что нужно.

У вас есть еще один вариант: логический оператор OR, представленный ||, чтобы проверить, верно ли одно из двух условий.

 

var isPluggedIn = false
var hasBatteryPower = true
 
if isPluggedIn || hasBatteryPower {
  print(”You can use your laptop.”)
} else {
  print(”?”)
}


Console Output:
You can use your laptop.

 

В этом примере выводится сообщение “Вы можете использовать свой ноутбук”. Несмотря на то, что значение isPluggedIn равно false, значение hasBatteryPower равно true, и оператор || ИЛИ определил, что один из вариантов имеет значение true.

Оператор switch

Вы видели инструкции if и if-else, которые можно использовать для выполнения определенных блоков кода в зависимости от определенных условий. Но длинная цепочка "if", "else if", "else if"... инструкции else могут стать запутанными и трудными для чтения после небольшого количества вариантов. У Swift есть еще один инструмент для управления потоком, известный как оператор switch, который является оптимальным для работы со многими потенциальными условиями.

Базовая инструкция switch принимает значение с несколькими параметрами и позволяет запускать отдельный код на основе каждого параметра или случая. Вы также можете указать вариант по умолчанию, чтобы указать блок кода, который будет выполняться во всех случаях, которые вы специально не определили.

Рассмотрим код, который выводит название транспортного средства на основе его количества колес:

 

let numberOfWheels = 2
switch numberOfWheels {
case 0:
    print("Missing something?")
case 1:
    print(”Unicycle”)
case 2:
    print(”Bicycle”)
case 3:
    print(”Tricycle”)
case 4:
    print(”Quadcycle”)
default
    print(”That’s a lot of wheels!”)
}

 

Учитывая константу numberOfWheels, код предоставляет отдельное действие, если значение равно 0, 1, 2, 3 или 4. Он также обеспечивает действие, если numberOfWheels - это что-то еще.

Этот код можно было бы написать как вложенный оператор if-else, но его быстро стало бы сложно разобрать.

Любой данный оператор case также может оценивать несколько условий одновременно. Следующий код, например, проверяет, является ли символ гласным или нет:

 

let character = “z”
 
switch character {
case “a”, “e”, “i”, “o”, “u”:
    print(”This character is a vowel.”)
default
    print(”This character is a consonant.”)
}

 

При работе с числами вы можете использовать сопоставление интервалов для проверки включения в диапазон. Взгляните на синтаксис в следующем фрагменте кода:

 

switch distance {
case 0...9:
    print(”Your destination is close.”)
case 10...99:
    print(”Your destination is a medium distance from here.”)
case 100...999:
    print(”Your destination is far from here.”)
default
    print(”Are you sure you want to travel this far?”)
}

 

Оператор switch - это правильный инструмент для управления потоком, когда вы хотите запускать различный код, основанный на множестве различных условий.

Тернарный условный оператор

Интересным (и очень распространенным) вариантом использования оператора if является установка переменной или возврат значения. Если определенное условие true, вы хотите присвоить переменной одно значение. Если условие равно false, вы хотите присвоить переменной другое значение.

Рассмотрим следующий код. Он проверяет, больше ли значение одного числа, чем другого, и присваивает большее значение переменной largest:

 

var largest: Int
 
let a = 15
let b = 4
 
if a > b {
  largest = a
} else {
  largest = b
}

 

Поскольку эта ситуация настолько распространена в программировании, многие языки включают специальный оператор, известный как тернарный условный оператор (?:), для написания более сжатого кода. Программисты Swift обычно опускают слово “условный” и называют его просто “тернарным оператором”.

Тернарный оператор состоит из трех частей:

  1. Вопрос с истинным или ложным ответом.
  2. Значение, если ответ на вопрос true.
  3. Значение, если ответ на вопрос false

Вот пример:

 

var largest: Int
let a = 15
let b = 4
 
largest = a > b ? a : b

 

Внимательно посмотрите на последнюю строку кода. Вы можете прочитать это как “Если a > b, присвоите a переменной largest; в противном случае присвоите b”. В этом случае a больше, чем b, поэтому его значение присваивается largest.

В Swift не обязательно требуется использовать тернарный оператор всегда. Но это полезно для присвоения значения на основе условия, вместо того, чтобы прибегать к более сложному оператору if-else.

Совет

Swift предоставляет глобальную функцию для поиска наибольшего значения в более удобном для чтения и кратком выражении.

largest = max(a, b)

 

Лабораторная работа

Откройте и завершите упражнения в Lab - Control Flow.playground.

Подключение к дизайну

Откройте рабочую книгу по дизайну приложения и либо добавьте комментарии к разделам Определения, которые вы завершили, либо добавьте пустой слайд в конце документа. Подумайте о том, какой выбор может потребоваться пользователю при использовании вашего приложения. Если вы обнаружите, что пишете что—то вроде “Если пользователь сделает X, то произойдет Y”, то вы начинаете думать о том, как ваше приложение будет вести себя при взаимодействии с ним пользователя - и как поток управления сделает это возможным.

В примере приложения Go Green для рабочей книги, когда пользователь регистрирует новый объект, он должен выбрать между мусором и переработкой, что влияет на тип создаваемой записи в журнале.

 


Отрывок из книги
Develop in Swift Fundamentals
Apple Education
https://books.apple.com/ru/book/develop-in-swift-fundamentals/id1581182804

Information

Apple, the Apple logo, Apple Books, Apple TV, Apple Watch, Cocoa, Cocoa Touch, Finder, Handoff, HealthKit, iPad, iPad Pro, iPhone, iPod touch, Keynote, Mac, macOS, Numbers, Objective-C, Pages, Photo Booth, Safari, Siri, Spotlight, Swift, tvOS, watchOS, and Xcode are trademarks of Apple Inc., registered in the U.S. and other countries. App Store and iBooks Store are service marks of Apple Inc., registered in the U.S. and other countries. ​
The Bluetooth® word mark and logos are registered trademarks owned by Bluetooth SIG, Inc. and any use of such marks by Apple is under license. ​
IOS is a trademark or registered trademark of Cisco in the U.S. and other countries and is used under license. ​
Other product and company names mentioned herein may be trademarks of their respective companies.