Пора ли переходить на Swift?

    Сегмент мобильной разработки регулярно предлагает участникам рынка новый инструментарий. О том, стоит ли использовать такую новую для программирования под iOS концепцию, как дженерики, а заодно о том, пора ли переходить на Swift, мы поговорили с Максимом Соколовым, специалистом по мобильной разработке компании Avito.


    — Расскажите, пожалуйста, в двух словах о себе и своем опыте работы со Swift.

    — На текущий момент я работаю в компании Avito разработчиком мобильных приложений для iOS. В мобильной разработке я около 5 лет, а до нее занимался различными направлениями, в частности, веб-сайтами, бэкэндом и desktop-приложениями.
    Swift мы начали использовать в Avito больше полугода назад, когда вышла вторая версия языка, накопилась обратная связь от сообщества разработчиков. Ранее в работе мы использовали Objective-C, но теперь весь новый код пишем на Swift.

    — Некоторые разработчики отзываются о Swift, как о весьма «сыром» языке, не подходящим пока для крупных проектов. Можете ли вы подтвердить или опровергнуть это мнение?

    — У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код. Упомянутые недостатки нельзя назвать причиной отказа от разработки больших проектов на Swift. Сталкиваясь с проблемами — мы находили решение. И мы уже отправили в продакшн достаточно объемный проект, написанный на этом языке.

    — Что же побудило вас, несмотря на эти сложности, перейти на Swift?

    — В первую очередь мы понимаем, что Apple развивает и будет развивать Swift, тогда как Objective-C уже давно не получал существенных изменений (не будем учитывать изменения, связанные с совместимостью Swift ). Переход на Swift сейчас — это в какой-то степени шаг в будущее.
    Мы в Avito, в качестве эксперимента, решили использовать Swift для одного из наших проектов. И в целом не столкнулись с непреодолимыми сложностями. Все стало получаться. Код  читается и пишется легче чем на Objective-C. А главное, получается типизированным и безопасным, в том числе, за счет применения дженериков.

    — Кстати, можно ли дженерики назвать одним из аргументов в пользу перехода на Swift?

    — В общем случае да.
    Но тут слишком многое зависит от бизнес-задач. Во-первых, разработчиков с богатым опытом работы со Swift не так много. Во-вторых, есть множество проектов, написанных ранее на Objective-C, их нужно поддерживать. А чтобы хорошо писать на Swift, его нужно изучать, тратить на это ресурсы. И эти факторы для бизнеса гораздо важнее. Соответственно,  дженерики — это не какой-то однозначный аргумент, обуславливающий миграцию на Swift. Это просто удобный инструмент.

    — Насколько активно вам приходится использовать дженерики в своей работе, и какие основные преимущества есть у этой концепции?

    — Мы используем дженерики очень активно. Эта концепция помогает нам писать качественный, строго типизированный, предсказуемый код. Мы видим, на что влияют наши изменения, а это для нас важно, т.к. мы пишем одной командой сразу несколько проектов, и у нас множество переиспользуемых компонентов. Конечно, мы следим за версионированием, но когда в компонент вносятся очередные изменения, мы хотим знать, на чем они отразятся. Когда мы используем дженерики, у нас нет динамического приведения типов; мы видим, что изменилась какая-то модель, какие-то требования к модели, поменялись протоколы. А возможные проблемы с типизацией выплывают сразу в виде ошибок. Это очень удобно.
    Поэтому дженерики используются повсеместно, учитывая, что концепция может применяться в самых разных сферах: и в работе с сетью, и с моделями данных, и даже с UI.

    — Концепция дженериков — не нова. Давным-давно появились аналоги в других языках, да и идеи обобщенного программирования существуют десятки лет. Почему же, на ваш взгляд, разработчики далеко не всегда (когда это возможно) к ним обращаются?

    — Действительно, дженерики в том или ином виде присутствуют во множестве языков программирования уже десятки лет. И, да, разработчики далеко не всегда к ним обращаются.
    В контексте языка Swift, без дженериков в принципе можно обойтись: мы можем писать на Swift и не использовать дженерики хотя бы потому, что ранее годами использовали Objective-C, где нет подобных конструкций, а теперь пытаемся на Swift проецировать свой старый опыт. На мой взгляд, в этом и кроется основная причина — когда ты видишь новую для себя технологию (которой не было в Objective-C), ты подходишь к ней аккуратно, и порой, учитывая опыт, обходишь ее стороной. Однако если в нее погрузиться, будет гораздо легче писать код. Да и сам код будет намного качественнее.

    — Для каких задач, на ваш взгляд, оптимальнее всего использовать дженерики (именно в рамках Swift)?

    — Таких задач довольно много. Дженерики хорошо помогают там, где есть некий алгоритм, который может быть переиспользован за счет работы с разными типами данных. Очевидные примеры — сортировка вещественных и целых чисел при помощи одного алгоритма (без простого копирования кода).
    Есть и более интересные примеры, в частности, работа с сетью или таблицами в iOS. Но без наглядных схем и конкретных примеров кода такие задачи разбирать довольно сложно. Эти примеры я как раз буду разбирать в рамках моего выступления на Мобиусе. Я расскажу, в каких местах подобные конструкции очень эффективно применять, и где они могут существенно сократить объем кода.
    Наиболее интересный случай, на мой взгляд, — это контрол для работы с таблицами UITableView. При использовании таблиц, приходится заниматься тайп-кастингом, но в докладе я постараюсь показать, как все это может работать при помощи дженериков. Более того, в данном контексте дженерики помогают в разы сократить объем кода.

    — Не порождает ли активное использование дженериков какие-либо проблемы приложения (с безопасностью и т.п.)?

    — Мы с такими проблемами не сталкивались.
    Какие тут могут быть сложности? Используя дженерики приходится тщательнее продумывать архитектуру, принимать решения, где использование дженериков оправдано, а где нет. Не стоит пытаться использовать данную технологию там, где от нее не будет выгоды.  Но это не проблема конкретно дженериков. Это справедливо для любой технологии.

    — Сталкивались ли вы в работе с неуместным использованием дженериков?

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

    — Есть ли какие-то ограничения использования дженериков именно в Swift?

    — Основным ограничением я бы назвал совместимость Objective-C и Swift: написанный на Swift дженерик-код нельзя будет использовать в Objective-C.



    Благодарим за беседу!

    Как было отмечено выше, Максим Соколов поднимет практические вопросы эффективности использования инструментария, предложенного разработчиками языка Swift (а именно, дженериков), для построения более предсказуемого и безопасного кода в рамках своего доклада на конференции Mobius. Мероприятие пройдёт 4 июня в Санкт-Петербурге.
    JUG.ru Group 685,96
    Конференции для взрослых. Java, .NET, JS и др. 18+
    Поделиться публикацией
    Комментарии 20
    • +17
      Ехал дженерик через дженерик…
      • +1

        В целом, swift выглядит довольно интересно и для десктопного софта, но пока стандартная библиотека довольно куцая, если говорить о linux. И не поддерживается windows, что является blocker'ом, если хочется кросс-платформенной разработки.


        Забавно видеть это в блоге java user group ,)

        • –2
          Думаю, что причина в этом:
          geektimes.ru/post/276450
          • 0
            Swift так и будет оставаться в таком состоянии, пока Apple не доведет его разработку до какого-то более или менее стабильного состояния, когда язык перестанем постоянно меняться с каждой новой версией.
            • +1

              Они по сути ещё в 0.3.x что бы они не писали про 3.x. Тот же rust был куда более зрелым к 1.0.

              • –1
                В каждом посте про Swift такие комментарии. Способ нумерации версий это, конечно, очень важный аспект языка, как шашечки прям.
                • 0

                  Разговор, в первую очередь, про стабильность API и стоимость сопровождения, как следствие этого.


                  Неиспользование semver запутывает, давая ощущение что язык уже стабилен и пригоден для его полноценного использования.

          • 0
            в objective-c тоже есть дженерики.

            и в чем тогда отличие swift от objective-c, только лишь в этом?

            У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код

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


            единственное логическое применение swift это графические обертки над низкоуровневыми компонентами из objective-c.

            • 0
              В Obj-C дженерики — это лишь сахарок для лишней проверки компилятором, рантайм как принимал объекты, так и принимает.
              Так что нет нормальных дженериков в OC.
            • +6
              Понятнее не стало, стоит переходить, не стоит, хотя заголовок статьи, говорит нам о том, что эта статья поможет нам в этом разобраться. Зато за дженерики, больше половины вопросов было задано: где использовать дженерики, как использовать, и т.д. Я не думаю, что, именно дженерики являются решающим моментом перехода на swift. У swift есть много положительных моментов, и еще столько же отрицательных, о них же здесь ни слова.
              • 0
                Такие статьи выходят регулярнее доброй половины дайджестов, и пока единственный верный вариант, на мой взгляд, писать старые проекты на obj c, а новые — на swift.
              • 0
                Конечно только лишь дженерик не повод переходить на Swift, ведь он есть и в Objective-C
                • +1
                  Так же не стоит забывать, что нет нормальной ИДЕ для swift. AppCode со Swift'ом работает отвратительно. А кодить в Xcode это еще та боль… Пожалуй лучше останусь на objc :) (и наблюдать, как бедные фанаты Swift будут страдать при выходе 3.0)
                  • +1
                    Никак :) Бета xCode, Swift 3, полет нормальный. Баги в икскоде конечно есть, но не критично.
                  • +2
                    Причем тут вообще дженерики?) Они сейчас есть и в objc, хоть и кривые немного. Суть свифта, как эплы говорят, отказаться от наследования и всё делать через композицию на протоколах, то есть pop. К тому же protocol + associated type прикольная штука, правда мой мозг пока тяжело эту фичу осваивает.
                    • +2
                      На свифт стоит переходить хотя бы потому, что на нем писать удобнее, быстрее и безопаснее. А еще есть куча всяких фич типа функционального стиля.
                      • 0
                        Единственно что отталкивает меня от swift так это отсутствие родного runtime точнее его зачатки, мосты в runtime objective-c для каждого чиха, таскание с приложением libswift*.dylib фреймворков, понятно что сделано чтобы не ломать совместимость при обновлении языка, но все же надеюсь что через пару лет apple таки поправит ситуацию. Стабилизирует язык и перенесет runtime в систему.
                        • +9
                          Концепция дженериков — не нова. Давным-давно появились аналоги в других языках, да и идеи обобщенного программирования существуют десятки лет. Почему же, на ваш взгляд, разработчики далеко не всегда (когда это возможно) к ним обращаются?

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


                          — Скажите, с самого начала увас была какая-то тактика и вы ее придерживались?

                          — С самого начала у меня была какая-то тактика и я ее придерживался.
                          • 0
                            Нужно больше дженериков!
                            • –1
                              Очень не хватает поддержки рефакторинга со стороны Xcode. Преимущества языка над obj-c вполне оправдывают его применение уже сегодня.

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

                              Самое читаемое