
Друзья, всем привет. На связи Дмитрий Кожевин — преподаватель базового курса «Android-разработчик» в OTUS. Специально для читателей нашего блога я подготовил перевод вот такой отчасти провокационной статьи. Очень интересно ваше мнение, поэтому после прочтения приглашаю всех в комментарии к данной публикации.
Как только Kotlin получил поддержку Google, явное волнение фанатов Kotlin стало не единственной реакцией. Те, кто не знаком с Kotlin, были весьма обеспокоены его уровнем совместимости с Java, средним временем, необходимым для его освоения, а также преимуществами использования Kotlin в целом.
В своих попытках объяснить и представить язык максимально коротким и ясным способом многие разработчики Kotlin ссылались на трехлетнюю параллель между Kotlin и вторым официальным языком iOS — Swift. Называя Kotlin «Swift of Android», все упростило задачу и помогло создать образ для языка. Тем не менее, это изображение также вызвало споры в сообществе iOS, так как некоторые разработчики iOS не сочли сравнение лестным и увидели в Kotlin просто подражателя.
По крайней мере, следует отметить, что хотя Swift появился в 2013 году, Kotlin появился еще в 2011 году. Следовательно, даже если сравнение Kotlin и Swift (в этом точном порядке) может быть удобным из-за более раннего знакомства Swift с широкой аудиторией, любое утверждение, что Котлин подражает — не оправдано.
Тем не менее, стоит ли сравнивать? Если да, то насколько сильно простирается сходство? И намекает ли его существование на тот факт, что выпуск приложений для iOS и Android изначально может стать проще и быстрее в будущем? Огромный опыт ScienceSoft в услугах по разработке мобильных приложений позволяет спекулировать на этом этапе. Давайте посмотрим на это.
Синтаксис
Синтаксис Swift не просто напоминает синтаксис Kotlin — в небольших кусках кода может быть до 77% сходства строк.
Основные различия могут быть сведены к таблице ниже:
Kotlin | Swift |
---|---|
fun | func |
val | let |
null | nil |
trait | protocol |
constructor | init |
: | -> |
Any | AnyObject |
!! | ! |
Основы, классы и функции имеют очень похожие способы выражения. В отличие от Objective-C, вызовы методов Swift похожи на вызовы Java и Kotlin, с их системой пространств имен и стилем точечной нотации. Например, вот как выглядит вызов функции на двух языках:
Kotlin | Swift |
---|---|
fun forecast(day: String, weather: String): String { | func forecast(_ day: String, _ weather: String) -> String { |
return «Today is $day, it's $weather.» | return «Today is \(day), it's \(weather).» |
} | } |
forecast(«Monday», «Raining») | forecast(«Monday», «Raining») |
И вот как классы объявлены в обоих:
Kotlin | Swift |
---|---|
class Residence { | class Residence { |
var numberOfRooms = 0 | var numberOfRooms = 0 |
fun Description() = | func Description() -> String { |
«A house with $numberOfRooms.» | return «A house with \(numberOfRooms).» |
} | } |
} |
В этой статье можно найти много других примеров, и если они нам что-то говорят, то это то, что оба языка имеют общую цель — быть максимально краткими и прозрачными, что делает жизнь разработчиков проще. Синтаксические системы Котлина и Свифта довольно эффективны в этом отношении, поскольку команды разработчиков высоко ценят их элегантность.
Security
Хотя Swift и Kotlin сильны и статичны с точки зрения типизирования, они также позволяют работать с динамическими типами. Таким образом, языки остаются краткими и гибкими, позволяя заблаговременно устранять ошибки и несоответствия. Поэтому они считаются очень безопасными и особенно надежными для больших проектов.
Кроме того, эти два языка сочетают в себе подходы к обработке необязательных значений и null/nil безопасности с помощью оператора безопасной навигации "?" или типы опций. Меры предосторожности со знаком "?" выражены почти одинаково как в Kotlin, так и в Swift:
Kotlin | Swift |
---|---|
val example: String? = null | var example: String? = nil |
Особенности
Помимо null (nil) безопасности, функций и классов, Kotlin и Swift обладают множеством схожих функций, включая
constants, variables, generics, protocols/traits
(trait заменено на interface, прим. переводчика ), enumerated types, any (anyobject)
, обработку ошибок и другие. Некоторые функции, реализованные на двух языках, разделяют подход, но называются по-разному из-за оригинального языка, к которому эти функции возвращаются.Например, в Kotlin можно найти лямбда-выражения Java. В Swift это блоки или замыкания, термины из Objective-C. То, как оба выражения вызываются в код, аналогично тому, как они работают.
Kotlin | Swift |
---|---|
{ | { _in |
println(«Lambda Expression») | print(«Closure Expression») |
} | } |
Функция, известная как вычисляемые свойства в Swift, которая является определенным объявлением свойства с вызовом get, также включена в Kotlin:
Kotlin | Swift |
---|---|
class Animal( | class Animal { |
var Genus: String, | var Genus: String |
var Species: String) { | var Species: String |
val binomialName: String | var binomialName: String { |
get() = "$Genus $Species" | get { |
} | return "\(Genus) \(Species)" |
} | |
} | |
} |
Параметры имени (или именованные аргументы) также используются на обоих языках:
Kotlin | Swift |
---|---|
fun daysoff(vacation: Int, weekends: Int): Int = vacation + weekends | func daysoff(vacation: Int, weekends: Int) -> Int { |
return vacation + weekends | |
} | |
daysoff(5, weekends = 8) | daysoff(vacation: 5, weekends: 8) |
На самом деле, вместо перечисления функций, которые существуют на обоих языках, было бы проще перечислить те, которые не имеют. А именно, только Kotlin поддерживает:
- импорт классов
- первичные конструкторы и классы данных
- @annotations
В то же время, в отличие от Котлина, Swift имеет:
- кортежи
- typealias
- guard statement
Значение сходства
Два языка четко разделяют идеологию, поскольку они решают те же проблемы, которые были созданы языками их предков: они менее многословны и ограничены по функциям, более удобочитаемы и удобны для работы. В то же время и Kotlin, и Swift остаются совместимыми с Java и Objective-C соответственно, что позволяет использовать их как в новых проектах, так и в обслуживании старых.
Более того, сильное сходство двух языков может помочь в разработке собственных приложений для iOS и Android. Разумеется, нельзя сказать, что приложения на обеих платформах могут совместно использовать один код, поскольку языки и библиотеки для конкретных ОС не идентичны. Тем не менее, подходы к логике и функциональности приложения могут быть очень похожими, благодаря синтаксическому и функциональному сходству между Swift и Kotlin. Это может сделать разработку, тестирование и обслуживание быстрее и проще.
Универсальный язык для iOS и Android?
Теоретически, Google мог уже принять Swift в качестве официального языка вместо Kotlin; даже в 2016 году ходили слухи об этой возможности. Такой шаг, возможно, не создал бы ситуацию, когда какие-либо кроссплатформенные инструменты разработки стали бы неактуальными, но разница между этими двумя платформами, несомненно, стала бы размытой.
Однако такой шаг также был бы неразумным, и не только из-за конкурентоспособности бизнеса. Хотя Свифт и Котлин похожи, больше всего они похожи на своих предшественников. Другими словами, Свифт и Котлин преодолевают разрыв между Objective-C и Java. Однако переход с Java на Kotlin все же более естественный и плавный, чем переход с Java на Swift.
В общем, мысль о приспособлении к чему-то новому не всем нравится; некоторые разработчики не торопятся, чтобы начать использовать новый язык, как это было с принятием Swift. Убедиться в том, что переход на новый язык будет не таким тяжелым испытанием, означает, что язык в конечном итоге завоевывает популярность, а для на нового языка это актуально в первую очередь.
Прощальная мысль
Поскольку мобильная разработка постоянно развивается, развиваются и технологии. Вот почему через 5-10 лет и Котлин, и Свифт могут стать чем-то совершенно другим. Пока неизвестно, будут ли языки продолжать устранять разрыв между собой. Тем не менее, поскольку iOS и Android ищут наиболее удобный, безопасный и быстрый инструмент для мобильной разработки, они смогут в конечном итоге говорить на одном языке в один прекрасный день.