SlideShare a Scribd company logo
1 of 43
Download to read offline
Swift + Kotlin = ❤
MAKE PEACE, NOT WAR
Swift + Kotlin = ❤
t.me/talanov
linkedin.com/in/talanovs
Stanislav Talanov
New Cloud Technologies
t.me/molyakos
linkedin.com/in/molyakos
Sergey Molyak
PapaJobs
DISCLAIMER
Funny disclaimer ¯_(ツ)_/¯
Cold statistics
77% string similarity
http://angelolloqui.com/blog/38-Swift-vs-Kotlin-for-real-iOS-Android-apps
Why?
PLACE FOR YOU
Why shouldn’t I just use Flutter/
React Native etc?
React Native
Main thread
Общая незрелость экосистемы
Архитектура в разы сложнее
Хороший, качественный код
Отсутствие возможности работы с Accessibility
JSCore — iOS / Android — ВИРТУАЛЬНАЯ МАШИНА
LLVM-несовместимый?
“Свой компонент” —  даже TextView
Royalty?
GroundBreaking Changes
Future-Proof?
Security?
Возможность писать без участия Native разработчиков
Не может в сторонние библиотеки
Ограничения использования API
Быстродействие
Актуализация кодовой базы
– React Native Immaturity - непредсказуемые
задержки из-за сырости
– Maintaining a Fork of React Native - пришлось делать
форк RN и дорого его поддерживать
– JavaScript Tooling - сложно масштабировать
написанное на JS
– Refactoring - тяжело рефакторить RN код
– JavaScriptCore inconsistencies - нет JSCore на
Android 
– React Native Open Source Libraries - кривые либы
– Parallel Infrastructure and Feature Work - пришлось с
нуля наводить мосты между компонентами на RN
React Native
– React Native Immaturity - непредсказуемые задержки из-за сырости
– Maintaining a Fork of React Native - пришлось делать форк RN и дорого его поддерживать
– JavaScript Tooling - сложно масштабировать написанное на JS
– Refactoring - тяжело рефакторить RN код
– JavaScriptCore inconsistencies - нет JSCore на Android 
– React Native Open Source Libraries - недостаточная поддержка
– Parallel Infrastructure and Feature Work - пришлось с нуля наводить мосты между
компонентами на RN
– Crash Monitoring - не все креши приходили в систему и тяжело дебажились
– Native Bridge - не стабильна интеграция с нейтивом
– Initialization Time - долго запускается аппа
– Initial Render Time - рендер дольше из-за чего мигает UI
– App Size - бинарник тяжелее
– 64-bit - 64бита на андроиде пока невозомжно
– Gestures - приходится отключать сложные жесты
– Long Lists - лагают длинные списки
– Upgrading React Native - тяжелый апдейт с версии на версию
– Accessibility - слабо поддерживаются режимы для инвалидов
– Troublesome Crashes - невозпроизводимые креши
– SavedInstanceState Across Processes on Android - невозможность сохранить стейт при
выключении из фона
React Native
https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a
https://medium.com/airbnb-engineering/react-native-at-airbnb-the-technology-
https://medium.com/airbnb-engineering/building-a-cross-platform-mobile-team-3e1837b40a88
https://habr.com/company/qlean/blog/416097/
https://engineering.udacity.com/react-native-a-retrospective-from-the-mobile-engineering-team-at-
udacity-89975d6a8102
Scade React/Native Kotlin/Native Flutter Xamarin
No third-party
IDE for Code /
Build
⛔ ⛔ ⚠ ⛔ ⛔
Vendor
Independence ⛔ ⚠ ⚠ ⚠ ⛔
Native UI
⚠ ⛔ ✅ ⛔ ⚠
Bridge -> Native
⛔ ✅ ✅ ✅ ⛔
Native for both
platforms
(iOS/Android)
⛔ ⛔ ✅ ⛔ ⛔
About Swift/Kotlin
Swift Kotlin
MultiParadigm ✅ ✅
Native for Android/iOS ✅ ✅
Optionals ✅ ✅
Extensions ✅ ✅
Closures ✅ ✅
Swift Kotlin Obj-C Java
MultiParadigm ✅ ✅ ⛔ ✅
Native for
Android/iOS ✅ ✅ ⚠ ⛔
Optionals ✅ ✅ ⛔ ⛔
Extensions ✅ ✅ ✅ ⛔
Closures ✅ ✅ ⚠ ⚠
nilhcem.com/swift-is-like-kotlin/
Swift Kotlin
var myVariable = 42
myVariable = 50
let myConstant = 42
var myVariable = 42
myVariable = 50
val myConstant = 42
let explicitDouble: Double = 70 val explicitDouble: Double = 70.0
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..<count {
print("Person (i + 1) is called 
(names[i])")
}
val names = arrayOf("Anna", "Alex", "Brian",
"Jack")
val count = names.count()
for (i in 0..count - 1) {
println("Person ${i + 1} is called $
{names[i]}")
}
for index in 1...5 {
print("(index) times 5 is (index * 5)")
}
for (index in 1..5) {
println("$index times 5 is ${index * 5}")
}
var shoppingList = ["catfish", "water",
"tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var shoppingList = arrayOf("catfish",
"water", "tulips", "blue paint")
shoppingList[1] = "bottle of water"
let numbers = [20, 19, 7, 12]
numbers.map { 3 * $0 }
val numbers = listOf(20, 19, 7, 12)
numbers.map { 3 * it }
Compiler
Swift
Source
Parsing
AST SIL IRGen LLVM
* AST — Abstract Syntax Tree
* SEMA — Semantic analysis
* SIL — Generation, Transformation, Optimisation
* IRGen — SIL -> LLVM IR -> LLVM
Kotlin
Source
Parsing
AST Kotlin IR ASM *.class
* KotlinLexer -> KotlinParser
* AST
* ASM
* *.class
Swift/Kotlin
Source
Parsing
AST SIL IRGen LLVM
Source
Parsing
AST Kotlin IR ASM *.class
LifeCycle
Android iOS
Create onCreate
loadView
viewDidLoad
Interactive
onStart
onResume
viewWillAppear
viewDidAppear
Not interactive
onPause
onStop
viewWillDisappear
viewDidDisappear
Destroy onDestroy deinit
Android iOS
Create onCreate scene: willConnectTo:
Interactive
onStart
onResume
sceneWillEnterForeground
sceneDidBecomeActive
Not interactive
onPause
onStop
sceneWillResignActive
sceneDidEnterBackground
Destroy onDestroy deinit
< iOS 12 iOS 13+ (SwiftUI)
Code example
77%
protocol RoomProfile {
var profileID: String { get }
var title: String { get }
var abbreviation: String { get }
var colorIndex: Int { get }
var type: Type { get }
}
enum Type {
case unknown
case user(_ id: String)
case group
}
interface RoomProfile {

val profileID: String

val title: String

val abbreviation: String

val colorIndex: Int

val type: Type

}
sealed class Type {

object Unknown: Type()

class User(val id: String): Type()

object Group: Type()

}
Syntax sugar
// Syntax sugar from Swift
fun List<String>.joined(separator: String): String {
val string = StringBuilder()
for (s in this) {
if (string.isNotEmpty()) {
string.append(separator)
}
string.append(s)
}
return string.toString()
}
fun String.replacingOccurrences(of: String, with: String) = replace(of, with)
didSet, willSet?
// Room List
private var sortedRoomList:
Set<RoomMessage> = Set() {
didSet {
// Do something
}
}
❓
didSet, willSet!
// Room List
private var sortedRoomList:
List<RoomModel> by
observing(emptyList(), didSet = {
// Do something
}
// Room List
private var sortedRoomList:
Set<RoomMessage> = Set() {
didSet {
// Do something
}
}
didSet, willSet:
// Syntax sugar from Swift
fun <T> observing(
initialValue: T,
willSet: () -> Unit = { },
didSet: () -> Unit = { }
) = object : ObservableProperty<T>(initialValue) {
override fun beforeChange(
property: KProperty<*>,
oldValue: T,
newValue: T): Boolean = true.apply { willSet() }
override fun afterChange(
property: KProperty<*>,
oldValue: T,
newValue: T) = didSet()
}
.filter.map
val names = users
.filter { it.id != null }
.map { it.name }
let names = users
.filter { $0.id != nil }
.map { $0.name }
.filter / .map
public inline fun
<T, C : MutableCollection<in T>>
Iterable<T>.filterTo(
destination: C, predicate: (T) ->
Boolean
): C {
for (element in this)
if (predicate(element))
destination.add(element)
return destination
}
@_transparent
public func _filter(
_ isIncluded: (Element) throws -> Bool
) rethrows -> [Element] {
var result = ContiguousArray<Element>()
var iterator = self.makeIterator()
while let element = iterator.next() {
if try isIncluded(element) {
result.append(element)
}
}
return Array(result)
}
.filter / .map
fun <E> filterTo(): ArrayList<E> {
for (element in this)
if (predicate(element))
destination.add(element)
return destination
}
func filter() -> [Element] {
var result = Array<Element>()
var iterator = self.makeIterator()
while let element = iterator.next() {
if try isIncluded(element) {
result.append(element)
}
}
return Array(result)
}
Questions?
t.me/talanov
linkedin.com/in/talanovs
Stanislav Talanov
New Cloud Technologies
t.me/molyakos
linkedin.com/in/molyakos
Sergey Molyak
PapaJobs

More Related Content

What's hot

Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...
Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...
Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...it-people
 
Разработка Single Page Applications с использованием Pony ORM и React JS
Разработка Single Page Applications с использованием Pony ORM и React JSРазработка Single Page Applications с использованием Pony ORM и React JS
Разработка Single Page Applications с использованием Pony ORM и React JSAlexey Malashkevich
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт GuavaEgor Chernyshev
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьMoscow.pm
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSSFDConf
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitAndrey Sitnik
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)it-park
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​FDConf
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Vasya Petrov
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptEugene Tataurov
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORMBadoo Development
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?Ivan Tsyganov
 
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)Badoo Development
 

What's hot (20)

Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...
Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...
Разработка одностраничных веб-приложений с использованием PonyORM и ReactJS -...
 
Разработка Single Page Applications с использованием Pony ORM и React JS
Разработка Single Page Applications с использованием Pony ORM и React JSРазработка Single Page Applications с использованием Pony ORM и React JS
Разработка Single Page Applications с использованием Pony ORM и React JS
 
Очень вкусный фрукт Guava
Очень вкусный фрукт GuavaОчень вкусный фрукт Guava
Очень вкусный фрукт Guava
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
CSSO — сжимаем CSS
CSSO — сжимаем CSSCSSO — сжимаем CSS
CSSO — сжимаем CSS
 
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, JammitВёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
Вёрстка в стиле Ruby: HAML, SASS, Compass, CoffeeScript, Jammit
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Memory managment in i os (1)
Memory managment in i os (1)Memory managment in i os (1)
Memory managment in i os (1)
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компилятор
 
Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Funny JS #2
Funny JS #2Funny JS #2
Funny JS #2
 
Erlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScriptErlang и n2o. Web-разработка без JavaScript
Erlang и n2o. Web-разработка без JavaScript
 
Javascript
JavascriptJavascript
Javascript
 
Reform: путь к лучшему ORM
Reform: путь к лучшему ORMReform: путь к лучшему ORM
Reform: путь к лучшему ORM
 
PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?PiterPy#3. DSL in Python. How and why?
PiterPy#3. DSL in Python. How and why?
 
Funny JS #1
Funny JS #1Funny JS #1
Funny JS #1
 
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
 

Similar to Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019

automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS developmentIvan Trifonov
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentAnton Kirillov
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человекаNETFest
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Magneta AI
 
SWIFT нужен ли он вам?
SWIFT нужен ли он вам?SWIFT нужен ли он вам?
SWIFT нужен ли он вам?Improve Group
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#Dmitri Soshnikov
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CSergey Pronin
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"LogeekNightUkraine
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...JetBrains Russia
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Working with API
Working with APIWorking with API
Working with APIMad Devs
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferencevoituk
 

Similar to Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019 (20)

automation is iOS development
automation is iOS developmentautomation is iOS development
automation is iOS development
 
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
Kotlin
KotlinKotlin
Kotlin
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
Scala, Play Framework и SBT для быстрого прототипирования и разработки веб-пр...
 
SWIFT нужен ли он вам?
SWIFT нужен ли он вам?SWIFT нужен ли он вам?
SWIFT нужен ли он вам?
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Mera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-CMera Dev Fest - Swift vs. Obj-C
Mera Dev Fest - Swift vs. Obj-C
 
Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"Sergii Tsypanov "Performance 1001 Tips"
Sergii Tsypanov "Performance 1001 Tips"
 
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
Разработка IntelliJ IDEA: впечатления новичка. Тагир Валеев, Senior Software ...
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
Scala for android
Scala for androidScala for android
Scala for android
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Working with API
Working with APIWorking with API
Working with API
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Groovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conferenceGroovy presentation on Exception #7 conference
Groovy presentation on Exception #7 conference
 

More from Mail.ru Group

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Mail.ru Group
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...Mail.ru Group
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинMail.ru Group
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Mail.ru Group
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовMail.ru Group
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваMail.ru Group
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...Mail.ru Group
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...Mail.ru Group
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidiaMail.ru Group
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоMail.ru Group
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковMail.ru Group
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковMail.ru Group
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Mail.ru Group
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиMail.ru Group
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupMail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Mail.ru Group
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Mail.ru Group
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Mail.ru Group
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Mail.ru Group
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Mail.ru Group
 

More from Mail.ru Group (20)

Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
Автоматизация без тест-инженеров по автоматизации, Мария Терехина и Владислав...
 
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
BDD для фронтенда. Автоматизация тестирования с Cucumber, Cypress и Jenkins, ...
 
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир ДубровинДругая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
Другая сторона баг-баунти-программ: как это выглядит изнутри, Владимир Дубровин
 
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
Использование Fiddler и Charles при тестировании фронтенда проекта pulse.mail...
 
Управление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон ВикторовУправление инцидентами в Почте Mail.ru, Антон Викторов
Управление инцидентами в Почте Mail.ru, Антон Викторов
 
DAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга СвиридоваDAST в CI/CD, Ольга Свиридова
DAST в CI/CD, Ольга Свиридова
 
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...Почему вам стоит использовать свой велосипед и почему не стоит  Александр Бел...
Почему вам стоит использовать свой велосипед и почему не стоит Александр Бел...
 
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...CV в пайплайне распознавания ценников товаров: трюки и хитрости  Николай Масл...
CV в пайплайне распознавания ценников товаров: трюки и хитрости Николай Масл...
 
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidiaRAPIDS: ускоряем Pandas и scikit-learn на GPU  Павел Клеменков, NVidia
RAPIDS: ускоряем Pandas и scikit-learn на GPU Павел Клеменков, NVidia
 
WebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий ОстапенкоWebAuthn в реальной жизни, Анатолий Остапенко
WebAuthn в реальной жизни, Анатолий Остапенко
 
AMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей ПешковAMP для электронной почты, Сергей Пешков
AMP для электронной почты, Сергей Пешков
 
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила СтрелковКак мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
Как мы захотели TWA и сделали его без мобильных разработчиков, Данила Стрелков
 
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
Кейсы использования PWA для партнерских предложений в Delivery Club, Никита Б...
 
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.ТаксиМетапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
Метапрограммирование: строим конечный автомат, Сергей Федоров, Яндекс.Такси
 
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru GroupКак не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
Как не сделать врагами архитектуру и оптимизацию, Кирилл Березин, Mail.ru Group
 
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)Этика искусственного интеллекта, Александр Кармаев (AI Journey)
Этика искусственного интеллекта, Александр Кармаев (AI Journey)
 
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
Нейро-машинный перевод в вопросно-ответных системах, Федор Федоренко (AI Jour...
 
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
Конвергенция технологий как тренд развития искусственного интеллекта, Владими...
 
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
Обзор трендов рекомендательных систем от Пульса, Андрей Мурашев (AI Journey)
 
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
Мир глазами нейросетей, Данила Байгушев, Александр Сноркин ()
 

Swift + Kotlin = ❤, Станислав Таланов и Сергей Моляк. 8 июня, 2019

  • 1. Swift + Kotlin = ❤ MAKE PEACE, NOT WAR
  • 2. Swift + Kotlin = ❤ t.me/talanov linkedin.com/in/talanovs Stanislav Talanov New Cloud Technologies t.me/molyakos linkedin.com/in/molyakos Sergey Molyak PapaJobs
  • 4.
  • 9. Why shouldn’t I just use Flutter/ React Native etc?
  • 10.
  • 11.
  • 12.
  • 13. React Native Main thread Общая незрелость экосистемы Архитектура в разы сложнее Хороший, качественный код Отсутствие возможности работы с Accessibility JSCore — iOS / Android — ВИРТУАЛЬНАЯ МАШИНА LLVM-несовместимый? “Свой компонент” —  даже TextView Royalty? GroundBreaking Changes Future-Proof? Security? Возможность писать без участия Native разработчиков Не может в сторонние библиотеки Ограничения использования API Быстродействие Актуализация кодовой базы – React Native Immaturity - непредсказуемые задержки из-за сырости – Maintaining a Fork of React Native - пришлось делать форк RN и дорого его поддерживать – JavaScript Tooling - сложно масштабировать написанное на JS – Refactoring - тяжело рефакторить RN код – JavaScriptCore inconsistencies - нет JSCore на Android  – React Native Open Source Libraries - кривые либы – Parallel Infrastructure and Feature Work - пришлось с нуля наводить мосты между компонентами на RN
  • 14. React Native – React Native Immaturity - непредсказуемые задержки из-за сырости – Maintaining a Fork of React Native - пришлось делать форк RN и дорого его поддерживать – JavaScript Tooling - сложно масштабировать написанное на JS – Refactoring - тяжело рефакторить RN код – JavaScriptCore inconsistencies - нет JSCore на Android  – React Native Open Source Libraries - недостаточная поддержка – Parallel Infrastructure and Feature Work - пришлось с нуля наводить мосты между компонентами на RN – Crash Monitoring - не все креши приходили в систему и тяжело дебажились – Native Bridge - не стабильна интеграция с нейтивом – Initialization Time - долго запускается аппа – Initial Render Time - рендер дольше из-за чего мигает UI – App Size - бинарник тяжелее – 64-bit - 64бита на андроиде пока невозомжно – Gestures - приходится отключать сложные жесты – Long Lists - лагают длинные списки – Upgrading React Native - тяжелый апдейт с версии на версию – Accessibility - слабо поддерживаются режимы для инвалидов – Troublesome Crashes - невозпроизводимые креши – SavedInstanceState Across Processes on Android - невозможность сохранить стейт при выключении из фона
  • 16. Scade React/Native Kotlin/Native Flutter Xamarin No third-party IDE for Code / Build ⛔ ⛔ ⚠ ⛔ ⛔ Vendor Independence ⛔ ⚠ ⚠ ⚠ ⛔ Native UI ⚠ ⛔ ✅ ⛔ ⚠ Bridge -> Native ⛔ ✅ ✅ ✅ ⛔ Native for both platforms (iOS/Android) ⛔ ⛔ ✅ ⛔ ⛔
  • 17.
  • 19. Swift Kotlin MultiParadigm ✅ ✅ Native for Android/iOS ✅ ✅ Optionals ✅ ✅ Extensions ✅ ✅ Closures ✅ ✅
  • 20. Swift Kotlin Obj-C Java MultiParadigm ✅ ✅ ⛔ ✅ Native for Android/iOS ✅ ✅ ⚠ ⛔ Optionals ✅ ✅ ⛔ ⛔ Extensions ✅ ✅ ✅ ⛔ Closures ✅ ✅ ⚠ ⚠
  • 22. Swift Kotlin var myVariable = 42 myVariable = 50 let myConstant = 42 var myVariable = 42 myVariable = 50 val myConstant = 42 let explicitDouble: Double = 70 val explicitDouble: Double = 70.0 let names = ["Anna", "Alex", "Brian", "Jack"] let count = names.count for i in 0..<count { print("Person (i + 1) is called (names[i])") } val names = arrayOf("Anna", "Alex", "Brian", "Jack") val count = names.count() for (i in 0..count - 1) { println("Person ${i + 1} is called $ {names[i]}") } for index in 1...5 { print("(index) times 5 is (index * 5)") } for (index in 1..5) { println("$index times 5 is ${index * 5}") } var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water" var shoppingList = arrayOf("catfish", "water", "tulips", "blue paint") shoppingList[1] = "bottle of water" let numbers = [20, 19, 7, 12] numbers.map { 3 * $0 } val numbers = listOf(20, 19, 7, 12) numbers.map { 3 * it }
  • 24. Swift Source Parsing AST SIL IRGen LLVM * AST — Abstract Syntax Tree * SEMA — Semantic analysis * SIL — Generation, Transformation, Optimisation * IRGen — SIL -> LLVM IR -> LLVM
  • 25. Kotlin Source Parsing AST Kotlin IR ASM *.class * KotlinLexer -> KotlinParser * AST * ASM * *.class
  • 26. Swift/Kotlin Source Parsing AST SIL IRGen LLVM Source Parsing AST Kotlin IR ASM *.class
  • 28.
  • 29.
  • 30. Android iOS Create onCreate loadView viewDidLoad Interactive onStart onResume viewWillAppear viewDidAppear Not interactive onPause onStop viewWillDisappear viewDidDisappear Destroy onDestroy deinit
  • 31. Android iOS Create onCreate scene: willConnectTo: Interactive onStart onResume sceneWillEnterForeground sceneDidBecomeActive Not interactive onPause onStop sceneWillResignActive sceneDidEnterBackground Destroy onDestroy deinit
  • 32. < iOS 12 iOS 13+ (SwiftUI)
  • 34. 77% protocol RoomProfile { var profileID: String { get } var title: String { get } var abbreviation: String { get } var colorIndex: Int { get } var type: Type { get } } enum Type { case unknown case user(_ id: String) case group } interface RoomProfile {
 val profileID: String
 val title: String
 val abbreviation: String
 val colorIndex: Int
 val type: Type
 } sealed class Type {
 object Unknown: Type()
 class User(val id: String): Type()
 object Group: Type()
 }
  • 35. Syntax sugar // Syntax sugar from Swift fun List<String>.joined(separator: String): String { val string = StringBuilder() for (s in this) { if (string.isNotEmpty()) { string.append(separator) } string.append(s) } return string.toString() } fun String.replacingOccurrences(of: String, with: String) = replace(of, with)
  • 36. didSet, willSet? // Room List private var sortedRoomList: Set<RoomMessage> = Set() { didSet { // Do something } } ❓
  • 37. didSet, willSet! // Room List private var sortedRoomList: List<RoomModel> by observing(emptyList(), didSet = { // Do something } // Room List private var sortedRoomList: Set<RoomMessage> = Set() { didSet { // Do something } }
  • 38. didSet, willSet: // Syntax sugar from Swift fun <T> observing( initialValue: T, willSet: () -> Unit = { }, didSet: () -> Unit = { } ) = object : ObservableProperty<T>(initialValue) { override fun beforeChange( property: KProperty<*>, oldValue: T, newValue: T): Boolean = true.apply { willSet() } override fun afterChange( property: KProperty<*>, oldValue: T, newValue: T) = didSet() }
  • 39. .filter.map val names = users .filter { it.id != null } .map { it.name } let names = users .filter { $0.id != nil } .map { $0.name }
  • 40. .filter / .map public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterTo( destination: C, predicate: (T) -> Boolean ): C { for (element in this) if (predicate(element)) destination.add(element) return destination } @_transparent public func _filter( _ isIncluded: (Element) throws -> Bool ) rethrows -> [Element] { var result = ContiguousArray<Element>() var iterator = self.makeIterator() while let element = iterator.next() { if try isIncluded(element) { result.append(element) } } return Array(result) }
  • 41. .filter / .map fun <E> filterTo(): ArrayList<E> { for (element in this) if (predicate(element)) destination.add(element) return destination } func filter() -> [Element] { var result = Array<Element>() var iterator = self.makeIterator() while let element = iterator.next() { if try isIncluded(element) { result.append(element) } } return Array(result) }
  • 42.
  • 43. Questions? t.me/talanov linkedin.com/in/talanovs Stanislav Talanov New Cloud Technologies t.me/molyakos linkedin.com/in/molyakos Sergey Molyak PapaJobs