— Расскажите, пожалуйста, в двух словах о себе и своем опыте работы со 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 июня в Санкт-Петербурге.
Комментарии (19)
grossws
27.05.2016 18:20+1В целом, swift выглядит довольно интересно и для десктопного софта, но пока стандартная библиотека довольно куцая, если говорить о linux. И не поддерживается windows, что является blocker'ом, если хочется кросс-платформенной разработки.
Забавно видеть это в блоге java user group ,)
macduck
27.05.2016 20:23Swift так и будет оставаться в таком состоянии, пока Apple не доведет его разработку до какого-то более или менее стабильного состояния, когда язык перестанем постоянно меняться с каждой новой версией.
svistkovr
27.05.2016 19:46в objective-c тоже есть дженерики.
и в чем тогда отличие swift от objective-c, только лишь в этом?
У Swift, безусловно, есть недостатки, в частности, связанные со средой разработки. Xcode время от времени падает, отключается подсветка синтаксиса или компилятор отказывается компилировать код
…
В первую очередь мы понимаем, что Apple развивает и будет развивать Swift, тогда как Objective-C уже давно не получал существенных изменений (не будем учитывать изменения, связанные с совместимостью Swift ). Переход на Swift сейчас — это в какой-то степени шаг в будущее.
единственное логическое применение swift это графические обертки над низкоуровневыми компонентами из objective-c.
eugeneego
27.05.2016 23:03В Obj-C дженерики — это лишь сахарок для лишней проверки компилятором, рантайм как принимал объекты, так и принимает.
Так что нет нормальных дженериков в OC.
tereznikov
27.05.2016 20:23+6Понятнее не стало, стоит переходить, не стоит, хотя заголовок статьи, говорит нам о том, что эта статья поможет нам в этом разобраться. Зато за дженерики, больше половины вопросов было задано: где использовать дженерики, как использовать, и т.д. Я не думаю, что, именно дженерики являются решающим моментом перехода на swift. У swift есть много положительных моментов, и еще столько же отрицательных, о них же здесь ни слова.
Smagold
30.05.2016 00:11Такие статьи выходят регулярнее доброй половины дайджестов, и пока единственный верный вариант, на мой взгляд, писать старые проекты на obj c, а новые — на swift.
Extro
27.05.2016 20:24Конечно только лишь дженерик не повод переходить на Swift, ведь он есть и в Objective-C
MeGaPk
27.05.2016 23:03+1Так же не стоит забывать, что нет нормальной ИДЕ для swift. AppCode со Swift'ом работает отвратительно. А кодить в Xcode это еще та боль… Пожалуй лучше останусь на objc :) (и наблюдать, как бедные фанаты Swift будут страдать при выходе 3.0)
house2008
27.05.2016 23:04+2Причем тут вообще дженерики?) Они сейчас есть и в objc, хоть и кривые немного. Суть свифта, как эплы говорят, отказаться от наследования и всё делать через композицию на протоколах, то есть pop. К тому же protocol + associated type прикольная штука, правда мой мозг пока тяжело эту фичу осваивает.
landan
27.05.2016 23:26+2На свифт стоит переходить хотя бы потому, что на нем писать удобнее, быстрее и безопаснее. А еще есть куча всяких фич типа функционального стиля.
0xcffaedfe
28.05.2016 04:25Единственно что отталкивает меня от swift так это отсутствие родного runtime точнее его зачатки, мосты в runtime objective-c для каждого чиха, таскание с приложением libswift*.dylib фреймворков, понятно что сделано чтобы не ломать совместимость при обновлении языка, но все же надеюсь что через пару лет apple таки поправит ситуацию. Стабилизирует язык и перенесет runtime в систему.
dimakey
28.05.2016 11:51+9Концепция дженериков — не нова. Давным-давно появились аналоги в других языках, да и идеи обобщенного программирования существуют десятки лет. Почему же, на ваш взгляд, разработчики далеко не всегда (когда это возможно) к ним обращаются?
— Действительно, дженерики в том или ином виде присутствуют во множестве языков программирования уже десятки лет. И, да, разработчики далеко не всегда к ним обращаются.
— Скажите, с самого начала увас была какая-то тактика и вы ее придерживались?
— С самого начала у меня была какая-то тактика и я ее придерживался.
snowman647
30.05.2016 00:11-1Очень не хватает поддержки рефакторинга со стороны Xcode. Преимущества языка над obj-c вполне оправдывают его применение уже сегодня.
Evgeny42
Ехал дженерик через дженерик…