Этот пост является вольным переводом статьи Kotlin and Swift. Is it a whole new era in Mobile Development? by Andrew Cherkashyn
Когда в Google объявили о том, что они теперь официально будут использовать Kotlin для разработки под Android, я, как и многие другие Android-разработчики, вздохнул с облегчением. Я еще раз зашел на официальный сайт Kotlin, чтобы перепроверить функционал/синтаксис и сравнить его с последней версией Swift, на котором сейчас пишу, и вдруг ощутил это: проходит одна эпоха и начинается новая, по крайней мере в мобильной разработке...
В Kotlin, как и в Swift довольно много синтаксического сахара, который снижает объемы обычной рутины (сравнение синтаксиса тут). Но что меня особенно радует — они оба, прям "из коробки", поддерживают новые парадигмы программирования. Особенно функциональное программирование.
Принципы функционального программирования, конечно, не являются чем-то новым в разработке, даже наоборот. Но теперь, когда есть официальная поддержка "из коробки" в разработке под iOS и Android — стоит пользоваться именно ими.
Когда я только начинал свою карьеру в мобильной разработке, все писали циклы как-то так:
Java:
String[] mixedArray = new String[] { "4", "5", "a", "-2", "Str" };
int results = 0;
for (String element : mixedArray) {
results += Integer.parseInt(element);
}
Теперь же все используют функциональный подход, чтобы сделать все то же самое за один вызов, и этот подход намного лучше:
Kotlin:
val mixedArray = arrayOf("4", "5", "a", "-2", "Str")
val results = mixedArray
.filter { obj -> obj.toIntOrNull() != null }
.map { x -> x.toInt() }
.reduce { acc, x -> acc + x }
Swift:
let mixedArray = ["4", "5", "a", "-2", "Str"]
let results = mixedArray
.filter({ (obj) -> Bool in return Int(obj) != nil })
.map { (obj) -> Int in return Int(obj)! }
.reduce(0, +)
Блоки были представлены Apple для Objective-C в 2010 году (iOS SDK 4.0), чтобы улучшить жизнь разработчиков и соответствовать анонимным классам в Java, которые могут быть использованы как коллбэки:
Пример блока в Objective-C:
void (^newBlock)(void) = ^{
NSLog(@"New block is called");
};
Пример анонимного класса в Java:
(new CallbackClass() {
@Override public void call() {
Log.i(StaticTag, "Callback is called");
}
});
Лямбда-выражения в Java были представлены в 2014, как часть JDK 8, но к сожалению они не были доступны Android-разработчикам, потому что Android SDK поддерживает только JDK версии 7 (поэтому и есть такие библиотеки, как retrolambda).
Теперь же оба языка полностью поддерживают такой подход: в Swift — "замыкания" (то же самое, что блоки в Objective-C), а у Kotlin есть поддержка "лямбд", которая работает в Android SDK:
Пример замыкания в Swift:
{ _ in
print("Closure is called!")
}
Пример лямбды в Kotlin:
{
println("lambda is called!")
}
Начиная с Xcode 4, где-то с 2011, Objective-C предоставляет однострочную инициализацию для массивов и словарей:
Пример инициализация в Swift:
let numbersArray = [2, 4, 1]
let dictionary = ["key1": "value1", "key2": "value2"
В JDK доступна только статическая инициализация, но нет способа инициализировать Map в одну строку. Функция Map.of которая позволяет это, была представлена только в JDK 9.
Пример статической инициализации в Java:
// Array
private static final int[] numbersArray = new int[] {2, 4, 1};
// Map
private static final Map<String, String> map;
static
{
map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");
}
Но теперь Kotlin умеет делать так:
mapOf<String, String>("key1" to "value1", "key2" to "value2")
Еще одна вещь, которую я хочу выделить — Range операторы, которые делают вашу жизнь намного проще. Теперь вместо использования циклов for для простого обхода:
for (int i = 0; i < N; i++) {
// Do something
}
Вы можете делать в Kotlin так:
for (i in 0..N-1) {
// Do something
}
Или вот так в Swift:
for i in 0..<N {
// Do Something
}
Стоит еще упомянуть о кортежах (tuples). Они дают определенную свободу во взаимодействии с другими компонентами и помогают избегать создания дополнительных классов.
Итак, глядя на все эти новые "фичи" и многие-многие другие вещи, которые не упомянуты в этой статье — я бы предположил, что новая эпоха уже началась. Теперь всем новичкам, которые начинают свой путь в мобильной разработке, будут доступны все эти функции прямо "из коробки", и они смогут сократить затраты на рутинную разработку бизнес-логики и управление приложением. И это намного важнее, чем писать сотни строк для того чтоб сделать простой кусок работы. Конечно, раньше вы могли просто поставить и настроить дополнительную библиотеку, такую как PromiseKit, ReactiveCocoa, RxJava и т.п. Но я верю, что доступность этих парадигм и принципов — будет побуждать новых разработчиков использовать именно их, что приведет нас к светлому будущему. :)
Спасибо за внимание! Я надеюсь вам было интересно или, как минимум, это пост дал вам свежие идеи. Я пытался написать коротко, но если вам нужны более конкретные примеры и/или у вас есть предложения/замечания — пожалуйста, напишите в комментариях!
Автор: s_suhanov