Односторонние диапазоны
Операторы замкнутого диапазона имеют себе альтернативу — диапазон, который продолжается насколько возможно, но только в одну сторону, например, диапазон, который включает все элементы массива, начиная от 2 и до последнего индекса. В этих случаях вы можете пропустить значение с одной стороны оператора диапазона. Этот тип диапазона называется односторонним, потому что оператор имеет значение только с одной стороны. Например:
Оператор полузамкнутого диапазона так же имеет одностороннюю форму, которая записывается только с одним конечным значением. Точно так же как и в случае, когда вы включаете значение в обе стороны, конечное значение не является частью самого диапазона. Например:
Односторонние диапазоны могут быть использованы в разных контекстах, а не только в сабскриптах. Вы не можете итерировать по одностороннему диапазону, который пропускает первое значение, потому что становится не очевидным, где должна начинаться итерация. Вы можете итерировать по одностороннему диапазону, который пропускает последнее значение, однако, так как диапазон длится бесконечно, убедитесь, что вы добавили условие окончание итерации в цикл. Вы так же можете проверить имеет ли односторонний диапазон конкретное значение, что показано ниже:
Логические операторы
Логические операторы изменяют или комбинируют логические значения типа Boolean (булево) — true и false. Язык Swift, как и другие C-подобные языки, поддерживает три стандартных логических оператора:
- логическое НЕ (!a)
- логическое И (a && b)
- логическое ИЛИ (a || b)
Классы и Методы
Одна из самых частых вещей, которую вы будете делать при разработке приложении на Swift — создание классов и методов. Удалите все, что написали ранее в файл нашего playground’а.
Далее, мы создадим класс, который поможет нам, допустим, посчитать количество чаевых, которые мы должны оставить в ресторане.
Для того чтобы создать класс, нужно поставить ключевое слово class, после которого написать его имя. После чего, нужно написать фигурные скобки для тела класса.
Если вы создаете субкласс, то после имени субкласса, вам нужно поставить двоеточие и имя суперкласса. В отличии от Objective-C в Swift вам не нужно постоянно писать суперкласс NSObject или что-то другое. Добавьте в фигурные скобки следующее:
После того, как вы добавите этот код, вы получите несколько ошибок, не переживайте, мы скоро их исправим.
Свойства класса создаются точно так же как и просто константы или переменные. Здесь мы создали три константных свойства: первое — счет после уплаты налогов, второе — налоги, третье — счет до уплаты налогов.
Обратите внимание, что вы обязаны указывать начальное значение для свойств при их объявлении, также, вы можете указать их в инициализаторе. Но мы не сделали ни того, ни другого, поэтому получаем ошибки
Если нет желания указывать начальное или исходное значение, то необходимо объявить свойства как опционалы, но это совсем другая история, то есть туториал.
Теперь добавьте следующий блок в фигурные скобки:
Тут мы создали инициализатор для класса, который принимает два параметра. Инициализатор всегда называется ключевым словом init в Swift. Вы можете создать несколько инициализаторов, если вам так угодно, вот только они должны принимать разные параметры.
Смотрите, мы дали параметрам этого метода такие же имена как и свойствам класса. И, чтобы их не путать, мы поставили ключевое слово self.
Теперь, у нас нет никакого конфликта имен для свойства subtotal, так что нам больше не нужно добавлять self, потому что компилятор уже автоматически выводит его, когда это нужно. Для тех, кому не все равно откуда взялось subtotal = total / (taxPct + 1) поясним:
Теперь, добавьте следующий блок кода в фигурные скобки (после предыдущего в фигурных скобках):
Поясним, что для написания метода нам пригодится ключевое слово func. Когда мы создаем метод, мы должны указывать тип параметров явно и выходной тип метода, после результирующей стрелки ->.
Эта функция определяет размер налога, путем перемножения процента на общую сумму.
Теперь, добавляем следующий блок и снова в самый конец фигурных скобок:
Вот этот блок, когда представляет из себя новый метод, который выводит на экран три возможных варианта чаевых. Когда вы вызываете метод класса, то первый параметр необязательно должен иметь имя, но остальные должны.
Также, обратите внимание, что интерполяция строки не имеет ограничения в выводе переменных. Вы можете вписывать туда все что угодно — любые операции, которые только придут вам в голову!. Теперь, давайте добавим последний кусок кода в самый конец, после фигурных скобок:
Теперь, давайте добавим последний кусок кода в самый конец, после фигурных скобок:
Наконец-то, мы создали подобие калькулятора для чаевых Вот, что в итоге у нас должно было получиться в нашей «игровой площадке»:
Проверьте ваш Assistant Editor на наличие результата:
Инициализация через исходное значение
Если вы объявили перечисление вместе с типом исходного значения, то перечисление автоматически получает инициализатор, который берет значение типа исходного значения (как параметр 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:
Рекурсивные функции — самый простой путь работать с данными, которые имеют рекурсивную структуру. Например, ниже приведен пример, как функция вычисляет арифметическое выражение:
Эта функция вычисляет простое число, просто возвращая ассоциативное значение. Она вычисляет сложение или умножение, вычисляя выражение по левую сторону, затем по правую сторону, затем складывает или умножает их.
Оператор полузамкнутого диапазона
Оператор полузамкнутого диапазона (a..<b) задает диапазон от a до b, исключая значение b. Такой диапазон называется полузамкнутым, потому что он включает первое значение, но исключает последнее. Так же, как и для оператора замкнутого диапазона, значение a не должно превышать b. Если значение a равно значению b, то итоговый диапазон будет пустым.
Операторы полузамкнутого диапазона особенно удобны при работе с массивами и другими последовательностями, пронумерованными с нуля, когда нужно перебрать элементы от первого до последнего:
Хотя в массиве четыре элемента, диапазон 0..<count доходит только до 3 (т. е. до номера последнего элемента в массиве), так как это оператор полузамкнутого диапазона. Подробнее о массивах см. в главе .
Инструкции управления компиляторами
Инструкции управления компиляторами позволяют программе изменять аспекты поведения компилятора. В Swift есть две инструкции управления компиляторами: инструкция сборки конфигурации и инструкция управления строкой.
Блок условной компиляции
Блок условной компиляции позволяет коду быть условно скомпилированным в зависимости от значения одного или нескольких конфигураций сборки.
Каждый блок условной компиляции начинается с #if и заканчивается #endif. Простой блок условной компиляции выглядит так:
В отличие от условия инструкции if, блок условной компиляции оценивается во время компиляции. В результате инструкции компилируются и выполняются только, если блок условной компиляции будет true во время компиляции.
Условной компиляции может включать в себя литералы логического типа true и false, идентификатор, используемый с флагом командной строки -D, или любую платформу или функцию тестирования версий языка, перечисленных в таблице ниже.
Условие платформы | Действительные аргументы |
---|---|
os() | macOS, iOS, watchOS, tvOS, Linux |
arch() | i386, x86_64, arm, arm64 |
swift() | >= с последующим указанием номером версии |
canImport() | Имя модуля |
targetEnvironment() | simulator |
Номер версии функций swift() и compiler() для установки платформенных условий состоит из главного числа, опционального минорного числа, опционального числа патча и по аналогии далее. Все эти числа разделяются символом точки, без каких-либо пробелов. Версия для compiler() является версией компилятора, независимо от параметра версии Swift, переданного компилятору. Версия для swift() — это языковая версия, которая в данный момент компилируется. Например, если вы компилируете свой код, используя компилятор Swift 5 в режиме Swift 4.2, версия компилятора будет 5, а языковая версия — 4.2. С этими настройками следующий код печатает все три сообщения:
Аргументом для условия canImport() является имя модуля, который может отсутствовать. Это условие проверяет, возможно ли импортировать модуль, но фактически не импортирует его. Если модуль присутствует, условие версии возвращает true; в противном случае он возвращает false.
Условие версии targetEnvironment() возвращает true, когда код скомпилирован для симулятора; в противном случае он возвращает false.
Заметка
Функция тестирования платформы arch(arm) не возвращает true для устройств ARM 64. Функция тестирования платформы arch(i386) возвращает true, если код скомпилирован для 32-битного iOS симулятора.
Вы можете комбинировать условие компиляции, используя логические операторы &&, ||, и ! и использовать круглые скобки для группировки.
Аналогично инструкции if, вы можете добавить несколько веток условий для проверки различных условных компиляций. Вы можете добавить любое количество дополнительных ветвей через условия #elseif. Вы также можете добавить конечную дополнительную ветвь, используя условие #else. Условная компиляция, содержащий несколько ветвей, выглядит вот так:
Заметка
Каждая инструкция в теле блока условной компиляции анализируется, даже если он не компилируется. Тем не менее, есть исключение, когда блока условной компиляции включает в себя функцию тестирования версии языка. Инструкции анализируются, только если версия компилятора Swift соответствует той, что указана в функции тестирования версии языка. Это делается для гарантии того, что устаревший компилятор не будет разбирать синтаксис более поздних версий Swift.
Дополнительные образовательные программы
Swift-разработчик – это серьезная профессия, которая требует немалого объема знаний и навыков. Самому обучиться если не невозможно, то крайне сложно. Поэтому спрос на онлайн-курсы, интенсивы и вебинары не падает.
Предлагаю рассмотреть еще парочку полезных онлайн-программ для новичков и специалистов-практиков.
Swift с полного нуля. Быстрый старт – Свифт Лаб
Swift с полного нуля. Быстрый старт – это обучающая программа, которая состоит из более 50 онлайн-занятий, посвященных Swift-разработке.
Продолжительность всех уроков в целом – 5,5 часов. Студентам предоставляется неограниченный доступ к учебным материалам.
Курс предназначен для начинающих без какого-либо опыта программирования, которые хотят узнать, как создать IT-продукт для iOS.
В программе:
- работа с кортежами и опционалами;
- массивы данных;
- оператор guard;
- замыкания;
- основы языка;
- преобразование типов;
- псевдонимы типов;
- кортежи;
- операторы;
- работа со строками;
- переменные и константы;
- множества;
- циклы;
- параметры и их виды;
- замыкания.
Стоимость – 990 руб.
Еще несколько обучающих программ от Свифт Лаб:
- iOS разработчик с нуля
- SpriteKit. Создание 2D игр на Swift
Разработчик iOS – Swiftme.ru
Разработчик iOS – это программа обучения для студентов, желающих узнать об основах Swift-разработки. Авторы предлагают уникальную методику, которая включает в себя изучение книг, выполнение домашних заданий и онлайн-тестов, помощь наставников.
На данный момент доступен только формат самостоятельного обучения. В разработке индивидуальные занятия с преподавателем и онлайн-уроки в группе.
Что входит в самостоятельный курс:
- выдаются книги на русском языке о Swift-разработке и о самом языке;
- предлагается более 350 тестов;
- даются домашние практические задания, которых наберется около 170;
- помощь наставников;
- доступ в Telegram-чат и в Slack-чат.
Стоимость – от 600 руб.
Добавление и удаление
Для того, чтобы вставить символ в строку по указанному индексу, используйте 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 предусматривает три способа сравнения текстовых значений: равенство строк и символов, равенство префиксов, и равенство суффиксов.
Базовые типы и управление потоком в Swift
Только что вы познакомились с типом Int, который является типом для обозначения целочисленных значений, но есть еще несколько других типов.
Float и Double
Давайте попробуем вставить еще пару строк в конец нашей игровой площадки и познакомимся с базовыми типами Float и Double:
Есть два типа для работы с числами с плавающей точкой: Float и Double:
- Double — представляет собой 64-битное число с плавающей точкой. Используйте его когда число с плавающей точкой должно быть очень большим или чрезвычайно точным
- Float — представляет собой 32-битное число с плавающей точкой. Используйте его, когда значение не нуждается в 64-битной точности.
Тип Double — более точный, чем Float и является типом по умолчанию. Это значит, что константа priceInferred, является так же типом Double. Поэтому, если мы хотим заменить тип Double на тип Float, мы должны написать следующее:
Bool
Вписываем себе пример констант логического типа Bool:
Обратите внимание, что логические значения в Swift имеют значения true или false, в отличии от YES/NO в Objective-C. Так же как с Int и Double, вам не нужно указывать константы или переменные как Bool, если при создании вы присвоили им значения true или false
Подобрались к строковым значениям:
Обратите внимание, что больше мы не используем символ @ как в Objective-C
Конструкции If и интерполяция строк
Условное выражение выглядит очень похоже на любой другой язык. Круглые скобки вокруг условия опциональны, а вот фигурные скобки обязательны даже в тех случаях, когда вам нужно исполнить всего одну строку кода!
Так, в примере выше есть новая техника, называемая интерполяция строк. Если вы захотите вставить что-то в строку, что может быть заменено по значению, то вы должны использовать вот такой простой синтаксис: «\(ваше выражение)».
Вы можете наблюдать работу функции print() в боковой панели, но это может быть проблематично, если ваша строка длинная. Для того, чтобы увидеть результат полностью вам нужно нажать на пиктограмму глаза, в правой части playground’а, который появится при наведении на строку результата:
Есть и другой способ посмотреть длинное значение выражения. Вам нужно пройти в главное меню Xcode (то, что наверху) View\Assistant Editor\Show Assistant Editor.
Assistant Editor покажет вам результат работы функции print() без наведения на строку результата, что согласитесь, само по себе проще. Если вы что-то не поняли, то можете скачать наш файл playground’а со всем кодом что был написан выше.
Как лучше всего программировать на Swift?
Как мы видим, у нас есть много возможностей для программирования на Swift, в основном в macOS, хотя мы также можем использовать некоторые многоплатформенные редакторы, так что можно будет программировать в Windows. Из всех доступных вариантов Xcode предлагает разработчикам все необходимое для создания приложений для Mac, IPad и iPhone. И дело в том, что это не только позволит нам программировать на Swift, но также станет возможным компилировать и отправлять наши приложения в App Store. Это то, что предлагают не все IDE, поэтому, безусловно, даже если мы воспользуемся другим из доступных вариантов в конце, нам придется пройти через Xcode.
Разработка и другие реализации
Поскольку язык является открытым, есть перспективы его переноса в Интернет. Некоторые веб — структуры уже разработаны, такие как IBM «s Kitura , Совершенный и Vapor .
Официальная рабочая группа «Серверные API-интерфейсы» также была создана Apple, в которой члены сообщества разработчиков Swift играют центральную роль.
Вторая свободная реализация Swift , что цели какао , Microsoft «s Common Language Infrastructure ( .NET ), а также Java и Android платформы существует как часть элементов компилятора от RemObjects программного обеспечения .
Комбинируя инструменты из LLVM и Macintosh Programmer’s Workshop , можно запустить очень небольшое подмножество языка в Mac OS 9 .
Инструкция return
Инструкция return встречается в теле функции или определения метода и благодаря ему выполнение программы возвращается к вызову функции или метода. Выполнение программы продолжается сразу после вызова функции или метода.
Инструкция return может состоять только из ключевого слова return, или из ключевого слова return, за которым будет следовать выражение, как показано ниже:
Когда за инструкцией return следует выражение, значение выражения возвращают к вызову функции или метода. Если значение выражения не совпадает со значением возвращаемого типа, объявленного в функции или в объявлении метода, то значение выражения преобразуется в тип возвращаемого значения, прежде чем он будет возвращен к вызывающей функции или методу.
Заметка
Как описано в разделе , специальная форма инструкции return (return nil) может быть использована в failable инициализаторе для того, чтобы информировать о неудачной инициализации.
Когда за инструкцией return не следует выражения, оно может быть использовано только для возврата из функции или метода, не возвращающих значение (то есть, когда тип возвращаемого значения функции или метода Void или ()).
Строковые литералы
Строковый литерал представляет собой последовательность символов, взятых в двойные кавычки, и выглядит вот так:
Строковые литералы не могут содержать неэкранированные двойные кавычки («), неэкранированный обратный слеш (\), возврат каретки или перевод строки.
Многострочный строковый литерал заключен тремя двойными кавычками и выглядит следующим образом:
В отличие от однострочного строкового литерала, многострочный строковый литерал может содержать неэксклюзивные двойные кавычки (), возврат каретки и перевод строки. Многострочный не может содержать три неизолированные двойные кавычки рядом друг с другом.
Разрыв строки после «»», который начинается в многострочном строковом литерале, не является частью строки. Разрыв строки перед «»», который завершает литерал, также не является частью строки. Чтобы создать многострочный строковый литерал, который начинается или заканчивается переводом строки, введите пустую строку в качестве ее первой или последней строки.
Многострочный строковый литерал может быть отступом, используя любую комбинацию пробелов и Tab-ов; этот отступ не входит в строку. Три кавычки — «»», которые завершают литерал, определяет отступ: каждая непустая строка в литерале должна начинаться с точно такого же отступа, который появляется перед закрытием «»». Вы можете добавить дополнительные пробелы после этого отступа.
Разрывы строк в многострочном строковом литерале нормализуются для использования символа перевода строки. Даже если ваш исходный файл имеет сочетание возврата каретки, все разрывы в строке будут одинаковыми.
В многострочном строковом литерале запись обратной косой черты (\) в конце строки опускает эту строку из строки. Любые пробелы между обратным слэшем и разрывом строки также опущены. Вы можете использовать этот синтаксис для жесткого переноса многострочного литерала строки в исходном коде без изменения значения результирующей строки.
Специальные символы могут быть включены в строковые литералы, используя следующие экранированные последовательные записи:
- Нулевой символ (\0)
- Обратный слеш (\\)
- Горизонтальная табуляция (\t)
- Перевод строки (\n)
- Возврат каретки (\r)
- Двойные кавычки (\»)
- Одиночные кавычки (\’)
- Скаляр Юникода (\u {n}), где n между первым и восьмым шестнадцатеричными символами
Значение выражения может быть вставлено в строку литерала, поместив выражение в скобки после обратного слеша (\). Интерполированное выражение может содержать строковый литерал, но не может содержать неэкранированный обратный слеш (\), возврат каретки или перевод строки.
Например, все следующие строковые литералы имеют одинаковое значение:
Строка, разделенная расширенными разделителями, представляет собой последовательность символов, заключенную в кавычки и в равное количество символов (#). Строка, разделенная расширенными разделителями, имеет следующий вид:
Специальные символы в строке, разделенной расширенными разделителями, отображаются в результирующей строке как обычные символы, а не как специальные символы. Вы можете использовать расширенные разделители для создания строк с символами, которые обычно используются для создания каких-то эффектов: генерация интерполяции строк, запуск последовательности символов или закрытие строки.
В следующем примере показан строковый литерал и строка, разделенная расширенными разделителями, которые создают эквивалентные строковые значения:
Если вы используете более одного числового знака для формирования строки, разделенной расширенными разделителями, не ставьте пробелы между числовыми знаками:
Многострочные строковые литералы, создаваемые с использованием расширенных разделителей, имеют те же требования к отступам, что и обычные многострочные строковые литералы.
Дефолтный выводимый тип строчного литерала является String. Для получения дополнительной информации о типе String, см. Строки и символы и .
Строковые литералы, которые объединяются с оператором +, делают это во время компиляции. Например, значения textA и textB в примере ниже, являются идентичными, и объединения во время компиляции не происходит.
Функция Reduce
Предыдущий пример был простым и использовал лишь один функциональный метод. В этом разделе, вы попробуете реализовать более сложную логику с использованием функциональных методов.
Создайте новый плейграунд и ждите новое задание!
Своя функция Reduce
Ваша задача в этом разделе лишь немного сложнее. Возьмите четные числа от 1 до 10, и вычислите их сумму. Для этого вам понадобится функция reduce, которая принимает несколько входных значений и генерирует одно на выходе.
Я уверен, что вы с успехом справитесь и сами, но в любом случае ответ ниже! Добавьте следующую строку в ваш плейграунд:
В Assistant Editor будет следующий результат:
Императивный код, указанный выше, написан в том же ключе, что и код в предыдущем примере, с добавлением дополнительного цикла for-in.
Давайте посмотрим, как выглядит функциональный эквивалент!
Функциональная Reduce
Добавьте следующую строку в ваш плейграунд:
Вы увидите точно такой же результат:
Предыдущий раздел охватывал создание массива и использование filter. Конечным результатом этих двух операций является массив с пятью числами . Новым шагом в коде выше стало использование reduce.
reduce является чрезвычайно универсальным методом массивов и выполняет функцию однократно для каждого элемента, накапливая результаты.
Для того чтобы понять, как работает метод reduce, нужно посмотреть на его описание:
Первый параметр — это начальное значение типа U. В вашем текущем коде, начальное значение равно , и имеет тип Int (следовательно, U это в данном случае Int). Второй аргумент — это функция combine, и она выполняется один раз для каждого элемента массива.
combine принимает два аргумента: первый, типа U, является результатом предыдущего вызова combine, второй — значением элемента массива, с которым он объединен. Результат, возвращаемый reduce, это значение, возвращаемое последним вызовом combine.
Давайте разберем все шаг за шагом.
В вашем коде, первая итерация reduce приводит к следующему:
Сначала total имеет значение , а первый элемент входного массива равен 2. Если мы просуммируем эти значения, то на выходе (result) получится 2.
Вторая итерация показана ниже:
Во второй итерации, входное значение равно значению предыдущей итерации и следующего элемента из входного массива. Объединение их приводит к 2 + 4 = 6.
Продолжаем проделывать тоже самое для всех элементов массива, что приводит к следующим вводам и выводам:
Обозначенное звездочкой число в правом нижнем углу — общий результат.
Это довольно простой пример, на практике же вы можете выполнять любые виды интересных и сильных преобразований с reduce. Ниже приведены несколько простых примеров.
Добавьте следующую строку в ваш плейграунд:
Этот код использует reduce, чтобы найти максимальное значение в массиве целых чисел. В этом случае результат весьма очевиден! Помните, что здесь total на самом деле просто максимальный результат max последней итерации reduce.
Если вы пытаетесь изо всех сил понять, как это работает, почему бы не создать еще одну таблицу, где вы вычислите вводы и выводы combine (т.е. замыкания) для каждой итерации?
Примеры, которые вы видели, все уменьшают массивы целых чисел до одиночных целочисленных значений. Конечно, у reduce есть два типа параметров, U и T и они могут быть разными, и, конечно, не должны быть интеджерами. Это означает, что вы можете уменьшить массив одного типа до совершенно другого типа.
Добавьте следующую строку в ваш плейграунд:
Это приводит к следующему выводу:
Этот пример понижает массив целых чисел до строки, указанной выше.
Немного практики и вы будете использовать reduce по-всякому!
Задача
Можете ли вы использовать reduce для того, чтобы преобразовать массив digits в целое число, если массив ввода такой:
Ваш понижающий метод должен возвращать Int со значением 3141.
Магия Reduce
В предыдущем разделе, вы разработали свою собственную реализацию filter, что оказалось удивительно просто. Теперь вы увидите, что то же самое можно сделать и для reduce.
Добавьте следующий код в ваш плейграунд:
Код выше добавляет метод myReduce в Array, который имитирует встроенную функцию Array. Этот метод просто перебирает каждый элемента массива, вызывая на каждом этапе combiner.
Чтобы это проверить, замените один из методов reduce в вашем плейграунде на myReduce.
Вы, наверное, на этом этапе думаете о том, почему вам должно хотеться реализовать filter или reduce? Ответ: “А и не должно хотеться!”
Но тем не менее, вы можете захотеть расширить использование функциональной парадигмы в Swift и реализовать собственные функциональные методы
Видеть и понимать, насколько это легко реализовывать такие действенные методы, как reduce, очень важно и нужно
Комбинирование логических операторов
Можно также составлять и более сложные выражения из нескольких логических операторов:
В этом примере с помощью нескольких операторов && и || составляется более длинное и сложное выражение. Однако операторы && и || по-прежнему применяются только к двум величинам, поэтому все выражение можно разбить на три простых условия. Алгоритм работы будет следующим:
если пользователь правильно ввел код дверного замка и прошел сканирование сетчатки или если он использовал действующую ключ-карту или если он ввел код экстренного доступа, то дверь открывается.
Исходя из значений enteredDoorCode, passedRetinaScan и hasDoorKey первые два подусловия дают false. Однако был введен код экстренного доступа, поэтому все составное выражение по-прежнему равно true.
Заметка
Логические операторы Swift && и || являются лево-ассоциированными, что означает, что составные выражения с логическими операторами оценивают в первую очередь выражения слева направо.
Расписание в macOS
Swift — это язык программирования, специально разработанный для работы с macOS, его естественной средой обитания. Для этого мы можем получить некоторые IDE, подобные тем, которые мы представляем ниже.
Xcode, инструмент, созданный Apple для разработки и компиляции
Речь идет об IDE, которая стала среда разработки для macOS , включающий набор инструментов, созданных Apple, направленных на разработку всех видов программного обеспечения для компании из Купертино, будь то для macOS, iOS, watchOS и tvOS. С помощью этого инструмента будет непросто написать код Swift, поскольку он предоставляет такие функции, как расширенное завершение кода, сворачивание кода, подсветка синтаксиса. Кроме того, он имеет компилятор LLVM с открытым исходным кодом для C, C ++ и Objective-C, интегрированный и доступный в Терминале.
Не менее верно и то, что это непростое приложение и у него довольно высокая кривая обучения, но как только мы овладеваем им, мы получаем взамен очень мощный инструмент. Он также требует мощного компьютера и имеет проблемы с производительностью, поэтому он всегда был в поле зрения разработчиков. Кроме того, его использование стало практически необходимым, поскольку нам нужно, чтобы он мог компилироваться.
Мы можем скачать Xcode из Мак App Store, нажав здесь .
AppCode, специально разработанный для разработки на Swift
Сейчас мы говорим об IDE для разработки Swift, Objective-C, C и C + для iOS и macOS, построенной на платформе IntelliJ IDEA от JetBrains. Он выделяется рядом очень интересных функций. Например, пока мы пишем код, статический анализ или все поддерживаемые языки будут обрабатывать каждую ошибку или отображать предупреждение. По мере написания он также будет предлагать быстрые исправления. Мы сможем быстро переходить к любому классу, функции или символу в его кодировке, а также проверять только релевантное использование во время поиска.
Эта IDE поддерживает платформы XCTest, Quick, Kiwi, Catch, Boost.Test и Google Test. Предоставляет встроенное средство запуска тестов вместе с мощным пользовательским интерфейсом для исследования результатов тестирования. Кроме того, он включает единый интерфейс для самых популярных VCS, включая Subvercion, Git, GitHub, Mercurial и т. Д.
Мы можем скачать 30-дневную пробную версию с их веб-сайт Честного ЗНАКа .
CodeRunner, легкая среда разработки для программирования с поддержкой Swift
Речь идет об облегченной среде IDE программирования для iOS и macOS, предназначенной для поддержки всех наиболее часто используемых языков программирования и мгновенного их выполнения. Приложение может запускать код на 25 языках, включая нечеткий поиск, заполнители с возможностью выбора табуляции и фрагменты документации. Он также имеет более 200 синтаксических режимов и множество расширенных функций редактирования.
С помощью этой IDE мы можем выполнять код на таких языках, как AppleScritpt, C, C #, Go, HTML, Java, JavaScript, PHP, Python и других. Это также позволяет нам добавить поддержку Swift. Кроме того, это позволяет нам запускать многофайловые проекты без необходимости ручной настройки.
Мы можем скачать CodeRunner из этой ссылке.