Путеводитель по Swift. Теория и практические советы по написанию чистого кода

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Привет! Меня зовут Максим Федоряка, я Software Engineer (iOS) в компании Innovecs. В этом материале рассказываю об особенностях языка программирования Swift, а также делюсь советами и рекомендациями по его применению.

К январю 2019 года в мире использовали более 1,4 миллиарда устройств iOS. По состоянию на июль того же года iOS установили ​​на 22,1% всех мобильных девайсов.

В некоторых регионах, таких как США, Великобритания и Франция, Apple превосходит Android по количеству продаж смартфонов. Многие компании и разработчики сосредотачивают свои программные продукты в первую очередь на платформу iOS, а в некоторых случаях — инвестируют исключительно в iOS из стратегических соображений.

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

Что такое Swift

Swift — мощный и интуитивно понятный язык программирования для macOS, iOS, watchOS, tvOS и не только. Написание кода Swift интерактивно и увлекательно, синтаксис лаконичен и выразителен. Swift включает современные функции, которые нравятся разработчикам. Код Swift безопасен по своей задумке, но это не мешает создавать программное обеспечение, которое работает с молниеносной скоростью.

Swift будет отличным языком программирования для тех, кто только думает связать свою жизнь с созданием ПО, а также для людей, которые исследуют новые карьерные пути и приходят из других платформ, языков и экосистем. Ознакомиться со Swift можно даже не имея компьютера с macOS и Xcode, достаточно просто загрузить приложение Playgrounds для iPad.

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

SwiftUI — декларативный UI фреймворк. Вместо того чтобы писать код для управления каждым маленьким действием, вы просто говорите SwiftUI, что вы хотите, а затем позволяете фреймворку делать это за вас. Несмотря на популярность SwiftUI, у него есть своя специфика, о которой я расскажу ниже.

Развитие Swift

Представленный в 2014 году, Swift был разработан как замена более раннему языку программирования Apple Objective-C, который практически не изменился с начала 1980-х годов. В нем отсутствовали современные функции и удобства. Swift работает с фреймворками Apple Cocoa и Cocoa Touch. Ключевым аспектом дизайна Swift была способность взаимодействовать с огромным объемом существующего кода Objective-C, разработанного для продуктов Apple за предыдущие десятилетия.

Конечно, развитие не дается легко. Как и любой молодой язык программирования, первые годы Swift страдал от младенческих проблем, из них до недавнего времени — отсутствие стабильности ABI.

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

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

В Swift 5 ввели стабильность ABI, и с тех пор все вышеуказанные библиотеки будут упакованы и связаны с операционной системой. Это означает, что если в будущих версиях Swift произойдут какие-либо изменения, они будут поставляться с ОС, над которой работает разработчик. Приложение будет автоматически использовать его при работе в этой ОС без необходимости перекомпилировать и повторно загружать приложение.

Поскольку библиотеки Swift не нужно встраивать в приложение, размер пакета приложения будет уменьшаться, как и потребление памяти. Уменьшение общего размера приложения — преимущество для пользователей, так как теперь им нужно использовать меньше ресурсов для загрузки приложения из App Store.

Это было одной из наибольших проблем Swift. Сейчас, спустя 7 лет после его анонса в 2014 году, язык развился до абсолютно стабильного и удобного в использовании инструмента. Именно поэтому Swift — стандарт, когда мы говорим о разработке приложения для платформ Apple.

Зачем писать код на Swift

Лично для меня Swift ассоциируется с самими продуктами Apple. Они предлагают идеально отполированный опыт использования, где нет ничего лишнего. В других языках программирования десяток видов массивов, которыми никто не пользуется. У Swift всего один и он — именно то, что нужно для работы. И такие аналогии можно построить во всем.

Swift быстрее. Производительность Swift почти такая же, как у C ++, который считается самым быстрым в алгоритмических вычислениях. Objective-C работает медленнее, потому что он содержит устаревшие C API.

Swift быстрее, чем Objective-C, потому что он устранил ограничения языка C. Его улучшили с помощью передовых технологий разработки программного обеспечения, которые были недоступны при разработке C. Как упоминалось в Apple, Swift изначально был разработан для более быстрой работы.

Несмотря на то, что языки разные, они оба интегрируются и работают с API-интерфейсами Cocoa и Cocoa Touch для всех платформ Apple. Следовательно, обычный пользователь приложения не заметит разницы в скорости работы между Objective-C и Swift. Скорость также зависит от уровня и способностей программиста, поскольку даже на Swift можно написать медленное приложение.

Swift безопаснее. Swift разработали, чтобы исключить ошибки с помощью его особенностей — generics и optionals для достижения стабильности приложения. Следовательно, приложения, разработанные на Swift, менее подвержены ошибкам и сбоям.

Синтаксис и количество кода. Синтаксис Objective-C считается многими программистами непонятным в основном из-за квадратных скобок, которые можно увидеть везде. К этому можно привыкнуть, но синтаксис Swift выглядит намного более знакомым любому человеку, который ранее работал хоть с одним С-подобным языком программирования. Также, Swift позволяет писать меньше кода, что положительно сказывается на его читабельности и дает больше шансов обнаружить ошибки.

Недостатки Swift

Разумеется, ни один язык программирования не идеален. У Swift я могу отметить лишь несколько существенных проблем.

Наибольшая боль для меня и многих моих коллег — протокол Decodable, который практически не поддается дебагингу. Мы используем его постоянно для парсинга данных, приходящих из API с сервера, а также других подобных задач. Если парсинг не срабатывает, очень сложно понять, в чем причина. Единственный адекватный вариант — писать инициализаторы для моделей. На них уходит время и они часто необязательны, если бы не проблема с дебагом.

Другие недостатки тянутся от самих разработчиков, не умеющих правильно использовать инструменты языка. Очень часто встречаются люди, использующие guard там где он неуместен (по сути вместо каждого if). Также, многие статьи на Medium и прочих подобных ресурсах дают сомнительные советы по стилю написания кода. Часто рекомендуют использовать Swift Package Manager, который несомненно неплох, но он даже близко не подходит к количеству доступных в Cocoapods или Carthage библиотек. В результате программист либо выбирает библиотеку на основе доступности, а не качества, либо имеет зависимости в двух менеджерах пакетов. Это само по себе очень неудобно.

Как научиться писать код на Swift

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

  • Разработка приложений с помощью Swift — книга, в которой объясняются основы и достижения языка. Она служит необходимой теоретической базой, если вы хотите стать разработчиком Swift.
  • Введение в разработку приложений с помощью Swift — практический курса по разработке приложений. Учебное пособие описывает инструменты, техники и концепции, необходимые для работы с iOS. Также, вы узнаете о принципах дизайна пользовательского интерфейса и лучших практиках.
  • Swift Playgrounds — среда разработки, интегрированная в Xcode на MacOS, которую также можно установить как приложение на iPad. По сути, это обучающая программа, которая научит вас в интерактивном режиме программировать на Swift.

И разумеется, можно начать прямо с документации на сайте swift.org, где подробно изложено все, что нужно знать для начала работы со Swift.

Для приверженцев более практического подхода к обучению я бы порекомендовал ресурсы Hacking with Swift и raywenderlich.com. Они так же отлично подойдут и для более опытных разработчиков, которые находятся в поиске решения типовых и не очень проблем.

Личный опыт, выводы, советы

Когда ко мне обращаются начинающие разработчики, или те, кто устал от своего направления и думает попробовать iOS разработку, чаще всего они задают вопрос: UIKit или SwiftUI?

Сейчас SwiftUI окружает огромный хайп не без причины. Это совершенно новый подход к построению интерфейса для платформ Apple, который не может остаться без внимания. И я вполне могу понять, почему он привлекает людей, особенно новичков.

Как я говорил выше, принцип написания интерфейса на SwiftUI — декларативный, во что намного легче влиться, если раньше не имел дело с разработкой для iOS. Практически каждый первый пост, который я вижу на LinkedIn и Reddit от людей, хвастающихся своими первыми проектами на iOS, содержит в себе слова Written in SwiftUI.

Не поймите меня неправильно: это замечательная технология, которая 100% имеет будущее, зная Apple. Но это будущее еще не наступило. Работая на SwitUI в продакшн-приложении, сталкиваешься с проблемами в самых тривиальных задачах, будь то перекраска Switch, отсутствие нативного Pull to Refresh и другие. Как ответственные технические специалисты мы должны помогать клиентам делать верный выбор касаемо технического стека. Я призываю всех оценивать здраво, подходит ли эта технология для вашего приложения сейчас, или стоит пока посидеть на старом добром UIKit.

Новичкам я советую учить UIKit в первую очередь, так как это та технология, на которой сейчас написано практически все. Есть большой спрос на специалистов с опытом именно в UIKit. На SwiftUI определенно стоит обратить внимание, но пока что только для личных проектов или экспериментов в свободное время.

Также новичкам не стоит бояться закрытости операционной системы и экосистемы Apple, о которой ходит много мифов и слухов, включая высокий порог вхождения. Да, вам все еще потребуется компьютер на macOS, но ничего более. Для 95% разработки вам хватит симулятора, что отбрасывает необходимость покупать iPhone. Знаменитая Apple Developer подписка тоже нужна только если вы хотите выложить приложение в App Store, но совершенно не обязательна для начинающего разработчика.

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

👍НравитсяПонравилось5
В избранноеВ избранном2
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Прошу автора убрать из статьи бред про медленный C API. Статья рассчитана на новичков и не стоит плодить мифы и вкладывать в головы ложные идеи по собственному незнанию. Почитайте документацию по Objective-C на тему того, как устроен обмен сообщениями (к слову сказать, который сводится в вызову сильно оптимизированного трамплина из команд ассемблера), про статический диспатч методов в Swift и чем они отличаются и какую задачу решают.

UPD: приношу искренние извинения за тон — пролил черничный смузи на кардиган, когда читал про медленный C и не совладал с собой.

Objective-C работает медленнее, потому что он содержит устаревшие C API.

Лол, именно поэтому внутренности iOS и macos написаны на смеси objective-c/C/C++ :)
Эх, разработчики эппловских ОС почему-то сами не хотят писать на свифте. Все, что требует повышенной производительности — написано не на нем.

Ага, «поколение, взращённое на GUI» вместо чтения документации предпочитает карго-культ про устаревшие C API. Автору надо бы почитать про рантайм Objective-C и как сообщения пересылаются, прежде чем говорить, что C — медленный, прости Господи.

Недостатки Swift
Разумеется, ни один язык программирования не идеален. У Swift я могу отметить лишь несколько существенных проблем.

Недостатков больше, чем кажется, во-всяком случае больше, чем указано в статье.

Во-первых, компилятор. Он медленный. За продвинутую [относительно Obj-C] систему типов нужно платить значительно большим временем сборки/индексации/выведения типов и значительно большим размером биткода. Для каждого value типа генерируется таблица, для каждого протокола — таблица, для каждого generic’a — таблица или параметризированные копии. Все эти семантики обслуживает целый пласт вспомогательного кода. Opaque типы, неявные инициализаторы у структур; ключи для того же Codable; неявная поддержка Equatable для enum’ов и прочий подобный сахар — это все работа для компилятора за кадром с которой он справляется с переменной скоростью и стабильностью. Сейчас еще завезут корутины и акторов.

Во-вторых, вышеупомянутая поставка системных библиотек вместе с ОС — это одновременно и благословение и проклятие. Да, размер бинарника уменьшился. Но появилась зависимость от версии ОС. Обнаружился критический баг в Combine на iOS 13? Вы ничего с этим не сделаете. Для серьезных команд это откладывает адаптацию новых API на годы, пока бесплатные бета-тестеры (модные стартапы) не отловят все баги.

Тем не менее, я искренне считаю, что Swift — это один из лучших языков на сегодняшний день, во многом благодаря тому, что он open source и благодаря образцовому сотрудничеству мейнтейнеров с комьюнити на Swift.org.

Досить непогано. Назва трохи розходиться зі змістом, але є що почитати. Приєднуюся до автора у заклику опановувати Swift і не «боятися» складнощів із macOS та Apple Developer Program. Єдине зауваження, що підписка може знадобитися не тільки для публікації, але й для написання і тестування коду, що використовує CloudKit. Можливо, є іще якісь нюанси, проте, їх значно менше, ніж того, що доступно і без підписки, тому — пробуйте!

Назва трохи розходиться зі змістом

Я бы сказал, что название является чистым кликбейтом. «Теория и практические советы по написанию чистого кода» в статье отсутствуют в принципе.
Зато зачем-то в недостатках Swift упоминается неверное (по мнению автора) использование пакетных менеджеров, которые к языку вообще прямого отношения не имеют. К тому же, высказанное автором мнение стремительно устаревает. Например, мне уже попадались библиотеки, дропнувшие поддержку Carthage и выкладывающие обновления только на Cocoapods и SPM.
Ну и, из этого же блока, критика медиума. Так-то очень многие статьи на медиуме заметно выше качеством, чем эта статья. Да, естественно там есть и мусор (как на любой слабомодерируемой блогоплатформе), но, во-первых, тема не раскрыта, во-вторых, опять же, вообще непонятно, какое отношение это имеет к озвученной в названии теме. Это не специфично для Swift, можно любое название технологии по вкусу туда воткнуть и написать такой же текст, смысл не поменяется.

Тут еще надо вспомнить как подсы имеют привычку прилечь на денек раз в год. Отдохнуть.

Текст автора — похож на код в Swift: ОТСУТСТВУЮТ длинные и трудноПонимаемыеТрудноЧитаемые предложения... все кратко и лаконично.
При этом удалось передать максимум полезной информации про Swift 5.
И, конечно же, действительно полезные выводы и советы для новичков в конце статьи.
SwiftUI еще слишком сыроват, но это технология «которая 100% имеет будущее, зная Apple».
Спасибо, Максим Федоряка!

ЕДИНСТВЕННОЕ, что лично меня смутило при чтении статьи — статистика 2-летней давности.

Подписаться на комментарии