Документация

Оператор логического ИЛИ

Оператор логического ИЛИ (a || b) является инфиксным и записывается в виде двух вертикальных палочек без пробела. С его помощью можно создавать логические выражения, которые будут давать true, если хотя бы один из операндов равен true.


Как и описанный выше оператор логического И, оператор логического ИЛИ использует краткую проверку условия. Если левая часть выражения с логическим ИЛИ равна true, то правая не анализируется, так как ее значение не повлияет на общий результат.

В приведенном ниже примере первое значение типа Bool (hasDoorKey) равно false, а второе (knowsOverridePassword) равно true. Поскольку одно из значений равно true, результат всего выражения тоже становится true и доступ разрешается:

Поехали!

Запустите Xcode и пройдите по File\New\Project. Выберите iOS\Application\Single View Application и нажмите Next.

В графе Product Name (имя приложения) напишите TipCalculator, установите Language на Swift и смените Devices на iPhone. Use Core Data выбирать не нужно. После, нажмите Next.

Выберите директорию для сохранения проекта и нажмите Create.

Давайте взглянем, что создал для нас Xcode: в верхнем левом углу выберите iPhone Simulator и нажмите кнопку Play.

Если вы все сделали правильно, то вы увидите симулятор с белым экраном:

Xcode создал одностраничное приложение с пустым белым экраном. Но не переживайте, в этом туториале вы его заполните!

Добавление и удаление

Для того, чтобы вставить символ в строку по указанному индексу, используйте insert(_:at:) метод, а для того, чтобы вставить содержимое другой строки по указанному индексу, используйте метод insert(contentsOf:at:).

Для того, чтобы удалить символ из строки по указанному индексу используйте remove(at:), если вы хотите удалить значения по указанному диапазону индексов, используйте метод removeSubrange(_:):

Заметка

Вы можете использовать методы insert(_:at:), insert(contentsOf:at:), remove(at:) и removeSubrange(_:) с любыми типами, которые соответствуют протоколу RangeReplaceableCollection. Это включает в себя String, как показано тут, а так же коллекции, такие как Array, Dictionary и Set.

Подстроки

Вы можете получить подстроку из строки, например, используя сабскрипт или метод типа и prefix(_:), результат которого возвращает экземпляр подстроки, а не другую строку. Подстроки в Swift имеют практически те же самые методы, что и строки, что означает, что вы можете работать с подстроками так же как и со строками. Однако, в отличие от строк, вы используете подстроки непродолжительное время, пока проводите какие-то манипуляции над строками. Когда вы готовы хранить результат более продолжительное время, то вы конвертируете подстроку в строку. Например:

Как и строки, каждая подстрока имеет область в памяти, где хранятся символы, создающие эту подстроку. Разница между строками и подстроками в том, что для оптимизации производительности подстрока может использовать часть памяти, используемую для хранения исходной строки или часть памяти, которая используется для хранения другой подстроки. (Строки так же имеют похожую оптимизацию, но если две строки делят между собой память, то они считаются равными.) Это оптимизация означает, что у вас не будет потери производительности через копирование памяти, если вы не изменяете строку или подстроку. Как уже было сказано ранее, подстроки не подходят для долгосрочного хранения, так как они повторно используют хранилище исходной строки. Исходная строка должна находиться в памяти до тех пор, пока одна из ее подстрок все еще используется.

В примере выше и greeting является строкой, которая имеет свою область памяти, где создающие ее символы хранятся. Так как и beginning, является подстрокой от greeting, то она переиспользует память. которую использует greeting. И наоборот, newString является строкой, которая была создана из подстроки и теперь она имеет свое хранилище. Рисунок ниже поможет нам разобраться с этими взаимоотношениями:

Заметка

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

Swift предусматривает три способа сравнения текстовых значений: равенство строк и символов, равенство префиксов, и равенство суффиксов.

Инициализация через исходное значение

Если вы объявили перечисление вместе с типом исходного значения, то перечисление автоматически получает инициализатор, который берет значение типа исходного значения (как параметр rawValue) и возвращает либо член перечисления либо nil. Вы можете использовать этот инициализатор, чтобы попытаться создать новый экземпляр перечисления.

В этом примере Uranus инициализируется через его исходное значение 7:

Конечно не все возможные значения Int найдут отклик в данном перечислении. Из-за этого инициализаторы исходных значений всегда возвращают опциональный член перечисления. В этом примере possiblePlanet типа Planet? или “опциональный Planet”.

Заметка

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

Если вы попытаетесь найти планету с номером позиции 11, то значение опциональной Planet, возвращенное исходным значением инициализатора, будет nil:

Этот пример использует привязку опционалов для попытки добраться до Planet с исходным значением 11. Выражение if let somePlanet = Planet(rawValue: 11) создает опциональную Planet и устанавливает значение somePlanet опциональной Planet, если она может быть восстановлена. В этом случае невозможно добраться до планеты с позицией 11, таким образом срабатывает ветка else.

Рекурсивные перечисления

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

Например, ниже объявлено перечисление, которое хранит простые арифметические выражения:

Вы так же можете написать indirect прямо перед самим перечислением, что позволит обозначить то, что все члены перечисления поддерживают индиректность:

Перечисление может хранить три вида арифметических выражений: простое число, сложение двух выражений, умножение двух выражений. Члены addition и multiplication имеют два ассоциативных значения, которые так же являются арифметическими выражениями. Эти ассоциативные значения делают возможным вложение выражений. Например, выражение (5 + 4) * 2 имеет цифру справа от умножения и другое выражение слева от умножения. Поскольку данные вложены, перечисление использующееся для хранения данных, также должно поддерживать вложенность-это означает, что перечисление должно быть рекурсивными. Приведенный ниже код показывает как работает рекурсивное перечисление ArithmeticExpression для (5 + 4) * 2:


Рекурсивные функции — самый простой путь работать с данными, которые имеют рекурсивную структуру. Например, ниже приведен пример, как функция вычисляет арифметическое выражение:

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Основанная на типе точка входа

SE-0281 вводит новый атрибут @main, позволяющий нам объявить, где находится отправная точка для программы. Это позволяет нам точно контролировать, какая часть нашего кода должна запускаться первой, что особенно полезно для программ командной строки.

Например, при создании терминального приложения ранее нам нужно было создать файл с именем main.swift, способный запустить наш код:

Swift автоматически считал, что код в main.swift является кодом верхнего уровня, а значит он отвечает за создание экземпляра App. Так и остается даже после SE-0281 однако, если вы хотите, вы можете удалить main.swift и вместо этого использовать атрибут @main для обозначения структуры или базового класса, содержащий статический метод main(), используемый в качестве точки запуска программы:

Если мы запустим программу, Swift автоматически вызовет NewApp.main () для запуска вашего кода.

Новый атрибут @main будет понятен разработчикам UIKit и AppKit, в случае, когда мы используем @UIApplicationMain и @NSApplicationMain для обозначения наших делегатов приложения.

Однако есть некоторые нюансы, о которых вы должны знать при использовании @main:

  • Вы не можете использовать этот атрибут в приложении, которое уже имеет main.swift file.
  • У вас может быть не более одного атрибута @main
  • Атрибут @main может быть применен только к базовому классу – он не будет унаследован никакими подклассами.

Создание элементов интерфейса приложения

Помните, что ваш класс TipCalculatorModel имеет два значения для ввода: общая сумма (total) и процент налога (tax percentage).

Было бы здорово, если бы пользователь смог вводить значения с цифровой клавиатуры, таким образом, текстовое поле (Text Field) подходит идеально для этих целей. Что же касается ввода процента налога, то обычно запрещено использовать его для маленьких значений, так что лучше мы будем использовать слайдер (Slider).

В дополнение к текстовому вводу и слайдеру, нам также нужно: установить ярлыки (Label), панель навигации для отображения названия приложения, кнопку для выполнения вычислений и еще одно текстовое поле для вывода результата.

Давайте детально рассмотрим пользовательский интерфейс.

  1. Navigation Panel (или панель навигации). Вместо того, чтобы добавить панель навигации напрямую, выберите ваш View Controller, выделив его в иерархии документов как на рисунке: После этого идите в Editor\Embed In\Navigation Controller. Это установит вам панель навигации в ваш View Controller (отныне экран будем называть именно так). Сделайте двойной щелчок на панели навигации (Navigation Bar, которая внутри вашего View Controller) и установите имя Tip Calculator.

  2. Labels (или ярлыки). Перетащите Label или по-русски «ярлык» в ваш View Controller. Сделайте двойной щелчок мыши по ярлыку Label и напишите Bill Total (Post-Tax):. Выберите Label и нажмите на пятую вкладку в Inspector, установите там X=33 и Y=81. Повторите все то же самое и для второго ярлыка, только назовите его Tax Percentage (0%): X=20 и Y=120.

  3. Text Field (текстовое поле). Из библиотеки элементов перетащите объект под названием Text Field в ваш View Controller. В инспекторе атрибутов (atribute inspector) установите Keyboard Type = Decimal Pad. В инспекторе размеров (Size Inspector) установите: X=192, Y=77 и Width=392. 
  4. Slider (или слайдер). Перетащите Slider из библиотеки в ваш View Controller. В Attribute Inspector установите Minimum Value=0 (минимальное значение), Maximum Value=10 (максимальное значение) и Current Value=6 (текущее значение). В Size Inspector установите X=190, Y=116 и Width=396.
  5. Button (или кнопка). Из Object Library (привыкаем к английскому) перетаскиваем Button (или кнопку) в ваш View Controller. Сделайте двойной щелчок на кнопке и переименуйте в Calculate. В Size Inspector установите X=268, Y=154.
  6. Text View. Из Object Library перетаскиваем Text View в ваш View Controller. Сделайте двойной щелчек на Text View и удалите текст плейсхолдера. В Attribute Inspector убедитесь в том, что Editable и Selectable не выбраны! В Size Inspector установите X=16, Y=192, Width=568, Height=400.
  7. Tap Gesture Recognizer (элемента, распознающий движения). Из Object Library перетаскиваем Tap Gesture Recognizer в ваш Main View (используйте иерархию элементов для того, чтобы точно выделить Main View, а не элемент внутри него). Эта штука будет работать тогда, когда пользователь будет нажимать на элемент view для того, чтобы клавиатура исчезла.
  8. Auto Layout или (автопозиционирование). Interface Builder часто делает всю грязную работу за нас, когда устанавливает ограничения расположения элементов самостоятельно. В нашем случае мы как раз это и можем использовать. Для того, чтобы это сделать, выберите Main View в иерархии документа и нажмите третью кнопку в правой нижней части Interface Builder’а. Выберете Add Missing Constraints (или добавить недостающие ограничения расположения элементов).

Теперь запустите свой симулятор iPhone 6 и вы должны увидеть, что базовый интерфейс пользователя уже работает!

Оператор логического НЕ

Оператор логического НЕ (!a) инвертирует булево значение — true меняется на false, а false становится true.

Оператор логического НЕ является префиксным и ставится непосредственно перед значением, без пробела. Как видно из следующего примера, его можно воспринимать как «не a»:

Конструкция if !allowedEntry означает «если не allowedEntry». Идущая за ней строка будет выполнена, только если «не allowedEntry» является истиной, т. е. если allowedEntry равно false.

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

Свойства

Добавьте в Playground  следующий блок кода:

Теперь давайте разберем, что мы написали выше:

  1. Вы создаете базовый класс Instrument с ключевым словом class. Это будет корневой класс по иерархии всех будущих инструментов. Он определяет «Чертеж/План», который будет содержаться в основе любого созданного инструмента (дочерних классов). Поскольку это тип, имя должно начинаться с заглавной буквы (стоит запомнить!), в нашем примере с большой буквы начинается тип Instrument, это является обязательным соглашение в Swift.
  2. Затем объявили свойства (данные) инструмента, которые будут у всех будущих инструментов. В нашем случае это свойство brand, которому мы присвоили тип строки (String).
  3. Теперь нужно создать инициализатор для класса, он обозначается ключевым словом init. Его цель — это создание новых инструментов путем инициализации всех свойств (stored properties).
  4. На этом шаге мы как раз устанавливаем данные в свойство brand из того, что будет приходить в параметрах метода. Поскольку свойство и параметр имеют одинаковое имя, нужно использовать ключевое слово self, чтобы можно было инициализировать именно нашу локальную переменную.

Сейчас вы только что реализовали класс для будущих инструментов, который содержит одно свойство brand, но еще не задали для него поведение. Поведение – означает, что мы можем повлиять на состояние свойства (объекта), через реализацию метода(ов). Давайте добавим какое-нибудь поведение в виде методов для наших свойств.

История

Старший вице-президент по разработке программного обеспечения Apple Крейг Федериги во время анонса этого продукта заявил, что язык программирования Swift был заложен ещё в платформе NeXT (ОС NeXTSTEP выпускалась в —1995 годах), которая стала основой для современной macOS, а затем и iOS.

Разработка текущего варианта языка Swift была начата в 2010 году , руководителем отдела разработки инструментов для создания программного обеспечения Apple и одним из основных разработчиков LLVM. Swift заимствовал идеи из «Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, и ещё из стольких многих языков, что сложно перечислить». Первоначально для нового языка использовали название Shiny.

2 июня 2014 года на конференции WWDC Swift был официально представлен вместе с бесплатным руководством по использованию языка объёмом в 500 страниц, доступным на сервисе «iBook Store».

8 июня 2015 года компания Apple объявила о выпуске новой версии Swift 2.0, которая получила более высокую производительность, новое API обработки ошибок, улучшения синтаксиса языка, а также функцию проверки доступности функций Swift для целевых ОС.

3 декабря 2015 года была выпущена бета версия Swift 3.0 с поддержкой операционных систем OS X, iOS и Linux и лицензированная под открытой лицензией Apache 2.0 license with a Runtime Library Exception. Версия 3.0 обратно не совместима с более ранними версиями языка; начиная с нативной среды разработки XCode версии 9 более версии языка Swift-2 и ранее не поддерживаются.

В начале апреля 2016 неназванный источник СМИ в корпорации Google сообщил, что компания рассматривает возможность перевода языка Swift в язык «первого класса» для платформы Android. Ранее уже предъявлялись прототипы Swift компилятора для Android.

19 сентября 2017 года была выпущена версия Swift 4.0.

В сентябре 2018 года, вместе с новой версией iOS 12, была выпущена новая стабильная версия языка Swift 4.2, и появилась бета-версия Swift 5.0. В версии 5.0 заявлена, наконец, стабильная работа ABI со стандартными библиотеками (Swift Dynamic Library), поддержка регулярных выражений и первоклассное решение для с режимом обработки async/await.

Учебный план

Учебный план курса полностью основан на структуре и содержании книги “Swift. Основы разработки приложений под iOS и macOS (5ое издание)”. Ниже вы найдете перечень доступных тем. Для большинства тем, раскрытых в книге, доступны дополнительные учебные материалы, а так же задания для самостоятельного решения (домашние задания).

Введение в курс

Прежде, чем перейти к курсу

  Из чего состоит курс и советы по работе с ним открыть

Часть 1. Подготовка к разработке приложений

Глава 1. Подготовка к разработке в macOS Материалы отсутствуют

Глава 2. Подготовка к разработке в Linux Материалы отсутствуют

Глава 3. Подготовка к разработке в Windows Материалы отсутствуют

Часть 2. Базовые возможности Swift

Глава 4. Отправная точка

  Домашняя работа открыть

Глава 5. Фундаментальные типы данных

  Дополнительный раздел открыть

  Домашняя работа открыть


Часть 3. Контейнерные типы данных

Глава 6. Кортежи

  Домашняя работа открыть

Глава 7. Последовательности и коллекции

  Домашняя работа открыть

Глава 8. Диапазоны

  Дополнительные материалы открыть

  Домашняя работа открыть

Глава 9. Массивы

  Дополнительные материалы открыть

  Домашняя работа открыть

Глава 10. Наборы

  Домашняя работа открыть

Глава 11. Словари

  Домашняя работа открыть

Глава 12. Строка – коллекция символов

  Домашняя работа открыть

Часть 4. Основные возхможности Swift

Глава 13. Операторы управления

  Домашняя работа открыть

Глава 14. Опциональные типы данных

  Домашняя работа открыть

Глава 15. Функции

  Домашняя работа открыть

Глава 16. Замыкания

  Домашняя работа открыть

Глава 17. Дополнительные возможности

  Домашняя работа открыть

Глава 18. Ленивые вычисления Материалы отсутствуют

Часть 5. Введение в разработку приложений

Глава 19. Консольное приложение “Сумма двух чисел”

  Домашняя работа открыть

Глава 20. Консольная игра “Отгадай число”

  Домашняя работа открыть

Часть 6. Нетривиальные возможности Swift

Глава 21. Введение в объектно-ориентированное программирование Материалы отсутствуют

Глава 22. Перечисления

  Домашняя работа открыть

Глава 23. Структуры

  Домашняя работа открыть

Глава 24. Классы

  Домашняя работа открыть

Глава 25. Свойства

  Домашняя работа открыть

Глава 26. Сабскрипты

  Домашняя работа открыть

Глава 27. Наследование Материалы отсутствуют

Глава 28. Псевдонимы Any и AnyObject Материалы отсутствуют

Глава 29. Инициализаторы и деинициализаторы

  Домашняя работа открыть

Глава 30. Удаление экземпляров и ARC Материалы отсутствуют

Глава 31. Опциональные цепочки Материалы отсутствуют

Глава 32. Расширения

  Домашняя работа открыть

Глава 33. Протоколы Материалы отсутствуют

Глава 34. Разработка приложения в Xcode Playground

  Опечатки открыть

  Домашняя работа открыть

Глава 35. Универсальные шаблоны Материалы отсутствуют

Глава 36. Обработка ошибок Материалы отсутствуют

Глава 37. Нетривиальное использование операторов Материалы отсутствуют

Глава 38. Разработка приложения под iOS

  Домашняя работа открыть

Глава 39. Паттерны проектирования при разработке в Xcode Материалы отсутствуют

Сквозные параметры

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

Для создания сквозного параметра нужно поставить ключевое слово inout перед объявлением параметра. Сквозной параметр передает значение в функцию, которое затем изменяется в ней и возвращается из функции, заменяя исходное значение. Более подробную информацию поведения сквозных параметров и связанных с ними оптимизаций компилятора см. .

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

Заметка

Сквозные параметры не могут иметь значения по умолчанию, а вариативные параметры не могут быть сквозными, с ключевым словом inout.

Вот пример функции под названием swapTwoInts(_:_:), у которой есть два сквозных целочисленных параметра – a и b:

Функция swapTwoInts(_:_:) просто меняет значение переменной b на значение a, а значение a – на значение b. Для этого функция сохраняет значение a в локальной константе temporaryA, присваивает значение b переменной a, а затем присваивает значение temporaryA переменной b.

Вы можете вызвать функцию swapTwoInts (_: _:) с двумя переменными типа Int, чтобы поменять их значения

Обратите внимание, что имена someInt и anotherInt начинаются с амперсанда, когда они передаются в swapTwoInts (_: _:) функции:. В вышеприведенном примере видно, что исходные значения переменных someInt и anotherInt изменены функцией swapTwoInts (_: _:), несмотря на то, что изначально они были объявлены за ее пределами

В вышеприведенном примере видно, что исходные значения переменных someInt и anotherInt изменены функцией swapTwoInts (_: _:), несмотря на то, что изначально они были объявлены за ее пределами.

Заметка

Сквозные параметры – это не то же самое, что возвращаемые функцией значения. В примере с функцией swapTwoInts нет ни возвращаемого типа, ни возвращаемого значения, но параметры someInt и anotherInt все равно изменяются. Сквозные параметры – это альтернативный способ передачи изменений, сделанных внутри функции, за пределы тела этой функции.

Функциональные типы


У каждой функции есть специальный функциональный тип, состоящий из типов параметров и типа возвращаемого значения.

Пример:

В данном примере объявлены две простые математические функции – addTwoInts и multiplyTwoInts. Каждая из этих функций принимает два значения типа Int и возвращает одно значение типа Int, содержащее результат математической операции.

Обе функции имеют тип (Int, Int) -> Int. Эта запись означает следующее:

«функция с двумя параметрами типа Int, возвращающая значение типа Int».

Вот еще один пример, но уже функции без параметров и возвращаемого значения:

Эта функция имеет тип () -> Void, т. е. «функция без параметров, которая возвращает Void».

Слабые (weak) ссылки

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

Вы указываете слабую ссылку ключевым словом weak перед объявлением имени свойства или переменной.

Так как слабая ссылка не сильно держит экземпляр, то этот экземпляр может быть освобожден, пока слабая ссылка все еще ссылается на него. Таким образом ARC автоматически присваивает слабой ссылке nil, когда экземпляр, на который она указывает, освобождается. И поскольку слабые ссылки должны позволять изменять их значение до нуля во время выполнения, они всегда объявляются как переменные, а не как константы опционального типа.

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

Заметка

Когда ARC устанавливает слабую ссылку на nil, наблюдатели свойств не вызываются.

Пример ниже идентичен тому, что мы разбирали с вами с классами Person, Apartment, но только теперь в нем есть одно существенное отличие. В этот раз свойство tenant экземпляра класса Apartment объявлено как слабая ссылка:

Создадим как и в предыдущем примере сильные ссылки от двух переменных (john, unit4A) и связи между двумя экземплярами:

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

Экземпляр Person все еще имеет сильную ссылку на экземпляр Apartment, но Apartment имеет слабую (weak) ссылку на экземпляр Person. Это означает, что когда вы разрушаете сильную ссылку, которая содержится в переменной john, то больше сильных ссылок, указывающих на экземпляр Person, не остается:

А так как больше сильных ссылок на экземпляр Person нет, то свойство tenant становится равным nil:

Остается только одна сильная ссылка на экземпляр Apartment из переменной unit4A. Если вы разрушите эту сильную ссылку, то их общее количество станет равным нулю:

А так как больше сильных ссылок нет, то и экземпляр Apartment тоже освобождается:

Заметка

Там, где используются сборщики «мусора», слабые указатели иногда используются для реализации простого механизма кеширования, потому что объекты без сильных связей сразу отпускаются, как только у памяти появляется необходимость избавится от «мусора». Однако со включенной ARC значения удаляются только тогда, когда уходит последняя сильная связь на них, делая слабые связи не подходящими для текущей задачи.

Производительность

Это имен­но то, чего хоте­ли добить­ся раз­ра­бот­чи­ки Swift — ско­рость рабо­ты про­грамм и выпол­не­ния кода. Как заяв­ля­ет Apple, Swift в 2,5 раза быст­рее Objective-C и в 8 раз быст­рее, чем Python 2.7.

Цель, к кото­рой стре­мят­ся раз­ра­бот­чи­ки язы­ка — сде­лать его быст­рее, чем С++, кото­рый часто при­зна­ёт­ся самым быст­рым язы­ком про­грам­ми­ро­ва­ния.

Надо ли вам, что­бы про­грам­ма была мол­ние­нос­ной? В иде­а­ле — да, но не все­гда ради это­го нуж­но пере­хо­дить на новый язык про­грам­ми­ро­ва­ния. Если про­грам­мой поль­зу­ет­ся неболь­шое чис­ло людей, а зада­ча некри­тич­ная, то повы­ше­ние ско­ро­сти может быть не так замет­но. А вот пере­пи­сы­ва­ние про­грам­мы на новом язы­ке может быть болез­нен­ным. Так что ско­рость — не все­гда само­цель.

Односторонние диапазоны

Операторы замкнутого диапазона имеют себе альтернативу — диапазон, который продолжается насколько возможно, но только в одну сторону, например, диапазон, который включает все элементы массива, начиная от 2 и до последнего индекса. В этих случаях вы можете пропустить значение с одной стороны оператора диапазона. Этот тип диапазона называется односторонним, потому что оператор имеет значение только с одной стороны. Например:

Оператор полузамкнутого диапазона так же имеет одностороннюю форму, которая записывается только с одним конечным значением. Точно так же как и в случае, когда вы включаете значение в обе стороны, конечное значение не является частью самого диапазона. Например:

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

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

Логические операторы изменяют или комбинируют логические значения типа Boolean (булево) — true и false. Язык Swift, как и другие C-подобные языки, поддерживает три стандартных логических оператора:

  • логическое НЕ (!a)
  • логическое И (a && b)
  • логическое ИЛИ (a || b)

Using the LLDB Debugger

You can use the LLDB debugger to run Swift programs step-by-step, set breakpoints, and inspect and modify program state.

As an example, consider the following Swift code, which defines a function, and prints the result of calling that function:

Create a file named with the code above, and run the command, passing the filename as a command line argument, along with the option to generate debug information. This will create an executable named in the current directory.

Instead of running the program directly, run it through the LLDB debugger by passing it as a command line argument to the command.

This will start an interactive console that allows you to run LLDB commands.

Set a breakpoint on line 2 of the function with the () command, to have the process break each time the function is executed.

Run the process with the () command. The process will stop at the call site of the function.

Use the () command to inspect the value of the parameter.

The command can evaluate Swift expressions as well.

Use the () command to show the frames leading to being called.

Use the () command to resume the process until the breakpoint is hit again.

Use the () command again to inspect the value of the parameter for the second call to .

Use the () command to disable all breakpoints and the () command to have the process run until it exits.

Now that you’ve been introduced to the Swift REPL, build system, and debugger, here are a few suggestions for what to do next:

  • Check out the Package Manager project page for a deep dive into the Swift build system and package manager.
  • Read Contributing to Swift to learn about the different ways you can participate in the Swift community.
  • Go to developer.apple.com/swift for additional Swift resources, including videos, sample code, and playgrounds.

С этим читают