- PVSM.RU - https://www.pvsm.ru -
В ветке master проекта Kotlin Native появился пример uikit [1]. Это простое приложение под iOS, которое выводит на экран строку, введённую в поле ввода, и да, 100% кода написано на Kotlin. Выглядит оно так:
Да, но только если:
0). Вам действительно нужна общая кодовая база мобильных приложений.
1). Приложение мало завязано на платформу.
2). У Вас есть время на написание некоторого количества кода на Kotlin, который в будущем стоит переписать на Objective-C или Swift.
ViewController, AppDelegate и даже main-функция в примере написаны на Kotlin. Те файлы, которые написаны на Objective-C нужны только чтобы XCode не выдавал ошибку и не включаются в конечную сборку (я не нашёл способов исправить положение). Т.е. полноценный interop как с Java, видимо, пока что, недоступен. Это совсем не значит, что положение дел не изменится к релизу (сейчас проект на стадии alpha preview, а об этом примере даже поста в блоге [2] не было). Но спектр доступных сейчас возможностей довольно ограничен.
Идиоматический подход к написанию мультиплатформенного приложения на Kotlin — отдельно написать общую часть, отдельно — часть для каждой платформы. При этом на каждой платформе, по задумке, должны быть легко доступны все библиотеки, под неё написанные. В случае с Java работает хорошо. В случае с iOS дела сейчас обстоят следующим образом:
@ExportObjCClass
class KotlinViewController : UIViewController {
constructor(aDecoder: NSCoder) : super(aDecoder)
override fun initWithCoder(aDecoder: NSCoder) = initBy(KotlinViewController(aDecoder))
@ObjCOutlet
lateinit var label: UILabel
@ObjCOutlet
lateinit var textField: UITextField
@ObjCOutlet
lateinit var button: UIButton
@ObjCAction
fun buttonPressed() {
label.text = "Konan says: 'Hello, ${textField.text}!'"
}
}
То есть вполне неплохо. К каждому внешнему классу добавляем аннотацию @ExportObjCClass, к каждому графическому элементу из storyboard — @ObjCOutlet и @ObjCAction для каждого action. Классы на Objective-C доступны по их оригинальным именам.
В этой статье [3] описано, как это можно сделать. Через некоторое количество прослоек, с ручным преобразованием типов 2 раза, но зато можно звать Swift из Kotlin и Kotlin из Swift.
В теории, вес приложения должен увеличиться примерно на 100 кб (отсюда [4]).
Вместо GC будет использоваться ARC, так что особой разницы в производительности со Swift быть не должно.
Судя по докладам [5] участников команды разрабатывающей язык, обратная совместимость — один из их основных приоритетов. Насколько это хорошо — судить вам. Лично я считаю, что это намного лучше, чем у Swift и, в целом, язык хорош и большинство паззлеров [6] выглядят надуманными. Но есть 1 вещь, которая, по моему мнению, может быть «бомбой замедленного действия», при этом не может быть исправлена с соблюдением обратной совместимости.
Для реализации сопрограмм [7], которые делают так, чтобы синхронный и асинхронный код выглядели почти одинаково в язык было введено всего одно новое ключевое слово suspend, чем разработчики заслуженно гордятся [8]. Но для того чтобы методы-расширения (forEach [9], map...) работали так же быстро, как и обычный for [9] (и для вывода общих типов во время исполнения программы), было введено целых 3 (inline, crossinline, noinline [10]). Они явно не делают код читаемее. JIT теряет часть возможностей для оптимизации (подкаст об этом [11]), а опыт C показывает, что разработчики не умеют правильно пользоваться такими возможностями языка. В целом, не понимаю, почему то же самое нельзя было сделать аннотацией. Для меня inline выглядит как плохое решение достойной проблемы.
— На Kotlin скоро можно будет писать под все 3 основные платформы (Android, iOS, Web).
— Скорее всего, будет хорошая совместимость с Objective-C и Swift. Возможно лучше, чем та, что есть между этими языками. Учитывая опыт JetBrains в разработке компиляторов и IDE, в это можно поверить.
— У Kotlin легковесный Runtime языка под Android и Web. Под iOS, судя по всему, тоже будет не тяжёлым.
— Уже сейчас можно что-нибудь написать.
Автор: Кирилл Терехов
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/android-development/264342
Ссылки в тексте:
[1] uikit: https://github.com/JetBrains/kotlin-native/tree/master/samples/uikit
[2] блоге: http://blog.jetbrains.com/kotlin/
[3] статье: http://justmaku.org/2017-06-07-kotlin-on-ios
[4] отсюда: https://kotlinlang.slack.com/archives/C3SGXARS6/p1502811002000274?thread_ts=1502179497.959459&cid=C3SGXARS6
[5] докладам: https://www.youtube.com/watch?v=m5T0M7SnCC0
[6] паззлеров: https://github.com/angryziber/kotlin-puzzlers
[7] сопрограмм: https://kotlinlang.org/docs/reference/coroutines.html
[8] гордятся: https://www.youtube.com/watch?v=b4mBmi1QNF0
[9] forEach: https://kotlinlang.org/docs/reference/returns.html
[10] inline, crossinline, noinline: https://kotlinlang.org/docs/reference/inline-functions.html
[11] подкаст об этом: http://razbor-poletov.com/2017/06/episode-138.html
[12] Источник: https://habrahabr.ru/post/337958/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.