Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Swift と Kotlin

Yuka Ezura
September 16, 2017

Swift と Kotlin

iosdc2017

Yuka Ezura

September 16, 2017
Tweet

More Decks by Yuka Ezura

Other Decks in Programming

Transcript

  1. ezura (@eduraaa) • iOS engineer @ LINE
 • like: programming

    • mock mock radio • ΪϦγϟ఩ֶ / Swift • Blending Kotlin's culture into Swift • ఈ͔ΒֶͿ Swift • …
  2. Kotlin OOP extension interface
 default implementati on generics delegation null

    safety tailrec static
 type Java GC sealed class variance
 declaration object JS companion 
 object if, when expression Type inference (Corout ines) inline annotation FP
  3. • Started in 2010 • Object-oriented programming • Support functional

    programming • Static typing • Type inference • Null safety • Generic programming
  4. started in 2010 first official 1.0 release in 2016 Let's

    make a new language
 based on the knowledge 
 that has developed IDEs
  5. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } }
  6. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Object-oriented programming
  7. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Support functional programming
  8. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Static typing
  9. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Type inference
  10. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Generic programming
  11. class Class<T>: Super() { var property = "" fun method()

    { var nullable: String? = null if (nullable != null) { nullable.length } val list = listOf(1, 2, 3) list.forEach { print(it) } } } Null safety
  12. • Started in 2010 • Object-oriented programming • Support functional

    programming • Static typing • Type inference • Null safety • Generic programming
  13. • Started in 2010 • Object-oriented programming • Support functional

    programming • Static typing • Type inference • Null safety • Generic programming
  14. Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ ❌ runtime environment ❌ memory management

    ❌ background ❌ calling Java/Objective-C ❌ Culture ❌ features
  15. Index • What is Kotlin • Is Kotlin like Swift?

    • some keyword • some features • Traps
  16. Index • What is Kotlin • Is Kotlin like Swift?

    • some keyword • some features • Traps
  17. Syntax Swift Kotlin var, let func f(arg: Any) -> Any

    class AnyType { … } var obj = Obj() obj.method(arg: v) var, val fun f(arg: Any): Any class AnyType { … } var obj = Obj() obj.method(v) see also: http://nilhcem.com/swift-is-like-kotlin/
  18. Support functional programming Swift Kotlin val f = { x:

    Int -> /* … */ } obj.map { /* … */ } let f = { Int -> String in /* … */ } obj.map { /* … */ }
  19. Support functional programming Swift Kotlin val f = { x:

    Int -> /* … */ } obj.map { /* … */ } let f = { Int -> String in /* … */ } obj.map { /* … */ } constant constant
  20. Support functional programming Swift Kotlin val f = { x:

    Int -> /* … */ } obj.map { /* … */ } let f = { Int -> String in /* … */ } obj.map { /* … */ } first class function first class function
  21. Support functional programming Swift Kotlin val f = { x:

    Int -> /* … */ } obj.map { /* … */ } let f = { Int -> String in /* … */ } obj.map { /* … */ } higher-order function higher-order function
  22. Null safety Swift Kotlin let i: Int? i?.description if let

    i = i { i.description } val i: Int? i?.toString() if (i != null) { i.toString() }
  23. Null safety Swift Kotlin let i: Int? i?.description if let

    i = i { i.description } val i: Int? i?.toString() if (i != null) { i.toString() }
  24. extension Swift Kotlin extension String { func f() {} var

    v: String { return "" } } let string = "" string.f() string.v fun String.f() = {} val String.v: String get() = ""
 val string = "" string.f() string.v
  25. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P { func f() { /* do something */ } } interface I { fun f() { /* do something */ } }
  26. • Started in 2010 • Object-oriented programming • Support functional

    programming • Static typing • Type inference • Null safety • Generic programming • Some syntax • Extension • Default implementation
  27. Kotlin OOP extension interface
 default implementati on generics delegation null

    safety tailrec static
 type Java GC sealed class variance
 declaration object JS companion 
 object if, when expression Type inference (Corout ines) inline annotation FP
  28. Kotlin OOP extension interface
 default implementati on generics delegation null

    safety tailrec static
 type Java GC sealed class variance
 declaration object JS companion 
 object if, when expression Type inference (Corout ines) inline annotation FP
  29. extension Swift Kotlin extension String { func f() {} var

    v: String { return "" } } 
 fun String.f() = {} val String.v: String get() = “"
  30. extension Type Type function property function property Swift Kotlin extend

    type by
 functions/properties add
 functions/properties
  31. extension Type Type function property function property Swift Kotlin protocol

    interface extension String: MyProtocol { /* ... */ } -
  32. extension Type Type function property function property Swift Kotlin extend

    type by
 functions/properties add
 functions/properties
  33. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P { func f() { /* do something */ } } interface I { fun f() { /* do something */ } }
  34. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P { func f() { /* do something */ } } interface I { fun f() { /* do something */ } } P f() extension P f()
  35. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P { func f() { /* do something */ } } interface I { fun f() } fun I.f() { /* do something */ } P f() extension extension P f()
  36. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P { func f() { /* do something */ } } interface I { fun f() } fun I.f() { /* do something */ } class A: I {} // error P f() extension extension P f()
  37. default implementation 
 for protocol/interface Swift Kotlin protocol P {

    func f() } extension P where … { func f() { /* do something */ } } interface I { fun f() { /* do something */ } } P f() extension
 where … P f()
  38. Null safety Swift Kotlin let i: Int? i?.description if let

    i = i { i.description } val i: Int? i?.toString() if (i != null) { i.toString() }
  39. Null safety Swift Kotlin let i: Int? i?.description if let

    i = i { i.description } val i: Int? i?.toString() if (i != null) { i.toString() } Optional Nullable
  40. Null safety Swift Kotlin enum Optional<Wrapped> { case none case

    some(Wrapped) } nullable Optional Nullable
  41. Null safety Swift Kotlin enum Optional<Wrapped> { case none case

    some(Wrapped) } nullable exist some value 
 or not null or not null Optional Nullable
  42. Null safety Swift Kotlin ɹ exist some value 
 or

    not not null or null Value none or Value or null Optional Nullable
  43. Null safety Swift Kotlin ɹ exist some value 
 or

    not not null or null Value none or Value or null Optional Nullable Value = Int?
  44. Null safety Swift Kotlin ɹ exist some value 
 or

    not not null or null Int? none or Int? or null Optional Nullable Value = Int?
  45. Null safety Swift Kotlin ɹ exist some value 
 or

    not not null or null 1 
 or
 nil none or 1 
 or
 null or null Optional Nullable Value = Int?
  46. Null safety Swift Kotlin ɹ exist some value 
 or

    not not null or null .some
 (nil) none or or null null ?? Optional Nullable Value = Int?
  47. Some familiar functions Swift Kotlin [1, 2, 3].forEach { if

    $0 == 2 { return } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) }
  48. Some familiar functions Swift Kotlin [1, 2, 3].forEach { if

    $0 == 2 { return } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) }
  49. [1, 2, 3].forEach { if $0 == 2 { return

    } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) } Some familiar functions Swift Kotlin 1 3 1
  50. [1, 2, 3].forEach { if $0 == 2 { return

    } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) } Some familiar functions Swift Kotlin 1 3 1
  51. Some familiar functions Swift Kotlin @_inlineable public func forEach( _

    body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }
  52. Some familiar functions Swift Kotlin @_inlineable public func forEach( _

    body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) }
  53. Some familiar functions Swift Kotlin @_inlineable public func forEach( _

    body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) } inline: ݺͼग़͠ݩʹத਎Λల։ inline: ݺͼग़͠ݩʹத਎Λల։
  54. Some familiar functions Swift Kotlin @_inlineable public func forEach( _

    body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) } inline: ϩδοΫʹӨڹ͠ͳ͍ inline: ϩδοΫʹӨڹ͢Δ
  55. Some familiar functions Swift Kotlin @_inlineable public func forEach( _

    body: (Element) throws -> Void ) rethrows { for element in self { try body(element) } } public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit { for (element in this) action(element) } { if (it == 2) { return } println(it) } inline: ݺͼग़͠ݩʹத਎Λల։
  56. Some familiar functions Kotlin listOf(1, 2, 3).forEach { if (it

    == 2) { return } println(it) } Iterable $receiver$iv = (Iterable)CollectionsKt.listOf(new Integer[] {Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)}); Iterator var2 = $receiver$iv.iterator(); while(var2.hasNext()) { Object element$iv = var2.next(); int it = ((Number)element$iv).intValue(); if(it == 2) { return; } System.out.println(it); }
  57. Some familiar functions Kotlin listOf(1, 2, 3).forEach { if (it

    == 2) { return } println(it) } /* ... */ while(var2.hasNext()) { Object element$iv = var2.next(); int it = ((Number)element$iv).intValue(); if(it == 2) { return; } System.out.println(it); }
  58. listOf(1, 2, 3).forEach { if (it == 2) { return

    } println(it) } /* ... */ while(var2.hasNext()) { Object element$iv = var2.next(); int it = ((Number)element$iv).intValue(); if(it == 2) { return; } System.out.println(it); } Some familiar functions Kotlin
  59. listOf(1, 2, 3).forEach { if (it == 2) { return

    } println(it) } /* ... */ while(var2.hasNext()) { Object element$iv = var2.next(); int it = ((Number)element$iv).intValue(); if(it == 2) { return; } System.out.println(it); } Some familiar functions Kotlin non-local return
  60. [1, 2, 3].forEach { if $0 == 2 { return

    } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) } Some familiar functions Swift Kotlin 1 3 1
  61. Kotlin OOP extension interface
 default implementati on generics delegation null

    safety tailrec static
 type Java GC sealed class variance
 declaration object JS companion 
 object if, when expression Type inference (Corout ines) inline annotation FP
  62. • Started in 2010 • Object-oriented programming • Support functional

    programming • Static typing • Type inference • Null safety • Generic programming • Some syntax • Extension • Default implementation
  63. &

  64. References Kotlin (official reference)
 https://kotlinlang.org/docs/reference/ The Swift Programming Language (Swift

    4)
 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AboutTheLanguageReference.html Programming Kotlin
 by Stefan Bocutiu, Stephen Samuel Swift is like Kotlin: Hacker News (discussion)
 https://news.ycombinator.com/item?id=14364612 Swift is like Kotlin
 http://nilhcem.com/swift-is-like-kotlin/ SwiftKotlin
 https://github.com/angelolloqui/SwiftKotlin Swift vs Kotlin for real iOS/Android apps (ͱͯ΋ྑ͍هࣄͰͨ͠ʂ)
 http://angelolloqui.com/blog/38-Swift-vs-Kotlin-for-real-iOS-Android-apps Swift is NOT like Kotlin..?
 http://blog.applibot.co.jp/blog/2017/04/03/swift-is-not-like-kotlin/ iOSΞϓϦ։ൃऀ͔ΒݟͨKotlin (࣌ؒͷ౎߹Ͱল͍ͨ෦෼΋͋Γ·͕͢ɺߏจͷൺֱ͕៉ྷʹ·ͱ·͍ͬͯ·͢)
 https://speakerdeck.com/koishi/iosapurikai-fa-zhe-karajian-takotlin null҆શͰͳ͍ݴޠ͸ɺ΋͸΍ϨΨγʔݴޠͩ (nullable ͷछྨͱಛ௃)
 http://qiita.com/koher/items/e4835bd429b88809ab33#nullable-%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E7%89%B9%E5%BE%B4 Android։ൃΛड஫͔ͨ͠ΒKotlinΛΨοπϦ࢖ͬͯΈͨΒ࠷ߴͩͬͨ
 http://qiita.com/omochimetaru/items/98e015b0b694dd97f323 ๩͍͠SwiftΤϯδχΞͷͨΊͷKotlinೖ໳
 https://speakerdeck.com/inamiy/mang-siiswiftenziniafalsetamefalsekotlinru-men Kotlin and Swift. Is it a whole new era in Mobile Development?
 https://medium.com/@andycherkashyn/kotlin-and-swift-is-it-a-new-mobile-development-era-b4c5e81feb08 Swift/Kotlin߹ಉษڧձ
 https://oi-study.connpass.com/event/62521/
  65. [1, 2, 3].forEach { if $0 == 2 { return

    } print($0) } listOf(1, 2, 3).forEach { if (it == 2) { return } println(it) } Some familiar functions Swift Kotlin 1 3 1 ࣭໰ Swift Έ͍ͨͳڍಈʹͰ͖Δʁ
  66. A: ಗ໊ؔ਺Λ࢖͍·͢ listOf(1, 2, 3).forEach(fun(element: Int) { if (element ==

    2) { return } print(element) return }) ͜ͷ return ͸ಗ໊ؔ਺ͷ return ͘͢͝ৄ͍͠આ໌
 JavaϓϩάϥϚ͕KotlinͰͭ·͖͕ͮͪͳͱ͜Ζ
 http://qiita.com/koher/items/ d9411a00986f14683a3f#inline%2d%e3%81%a8%2dnon%2dlocal%2dreturn
  67. Some familiar functions Swift @_inlineable public func first( where predicate:

    (Element) throws -> Bool ) rethrows -> Element? { var foundElement: Element? do { try self.forEach { if try predicate($0) { foundElement = $0 throw _StopIteration.stop } } } catch is _StopIteration { } return foundElement } ྫ֎౤͛ͯ୤ग़ ༨ஊ
 Swift Ͱ forEachൈ͚͍ͨͱ͖
 ྫ: first(where: )