Slide 1

Slide 1 text

Swift & Kotlin 2017/9/16 ezura

Slide 2

Slide 2 text

ezura (@eduraaa) • iOS engineer @ LINE
 • like: programming • mock mock radio • ΪϦγϟ఩ֶ / Swift • Blending Kotlin's culture into Swift • ఈ͔ΒֶͿ Swift • …

Slide 3

Slide 3 text

official on Android

Slide 4

Slide 4 text

Kotlin

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Kotlin’s background

Slide 8

Slide 8 text

started in 2010 first official 1.0 release in 2016 Let's make a new language
 based on the knowledge 
 that has developed IDEs

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

class Class: 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

Slide 11

Slide 11 text

class Class: 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

Slide 12

Slide 12 text

class Class: 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

Slide 13

Slide 13 text

class Class: 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

Slide 14

Slide 14 text

class Class: 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

Slide 15

Slide 15 text

class Class: 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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ

Slide 19

Slide 19 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ

Slide 20

Slide 20 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ ❌ runtime environment ❌ memory management ❌ background ❌ calling Java/Objective-C ❌ Culture ❌ features

Slide 21

Slide 21 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ Is the learning cost low?

Slide 22

Slide 22 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ ෦෼΋͋Δ Is the learning cost low?

Slide 23

Slide 23 text

Swift ͱ Kotlin ͸ࣅ͍ͯΔʁʁ ෦෼΋͋Δ Is the learning cost low?

Slide 24

Slide 24 text

Kotlin ֶश
 Swift ஌ࣝͰϒʔετՄೳ

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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/

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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() }

Slide 33

Slide 33 text

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() }

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

• Started in 2010 • Object-oriented programming • Support functional programming • Static typing • Type inference • Null safety • Generic programming • Some syntax • Extension • Default implementation

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

Trap

Slide 40

Slide 40 text

extension Swift Kotlin extension String { func f() {} var v: String { return "" } } 
 fun String.f() = {} val String.v: String get() = “"

Slide 41

Slide 41 text

extension Type Type function property function property Swift Kotlin

Slide 42

Slide 42 text

extension Type Type function property function property Swift Kotlin

Slide 43

Slide 43 text

extension function Util class instance static Result method(Some target) Some
 Type Java

Slide 44

Slide 44 text

extension Util.method(instance) Java function Util class instance Some
 Type static Result method(Some target)

Slide 45

Slide 45 text

extension Collections.max(list) Java function Util class instance Some
 Type static Result method(Some target)

Slide 46

Slide 46 text

extension max(list) Java function Util class instance Some
 Type static Result method(Some target)

Slide 47

Slide 47 text

extension max(list) Java function Util class instance Some
 Type list.max() want to … static Result method(Some target)

Slide 48

Slide 48 text

extension Some
 Type function property Kotlin Util.extensionMethod(instance)

Slide 49

Slide 49 text

extension Some
 Type function property Kotlin obj.extensionMethod()

Slide 50

Slide 50 text

extension Type Type function property function property Swift Kotlin extend type by
 functions/properties add
 functions/properties

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

extension Type Type function property function property Swift Kotlin extend type by
 functions/properties add
 functions/properties

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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()

Slide 55

Slide 55 text

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()

Slide 56

Slide 56 text

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()

Slide 57

Slide 57 text

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()

Slide 58

Slide 58 text

default implementation 
 for protocol/interface Protocol Interface Implementation Implementation extension Swift Kotlin

Slide 59

Slide 59 text

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() }

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

Null safety Swift Kotlin enum Optional { case none case some(Wrapped) } nullable exist some value 
 or not null or not null Optional Nullable

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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?

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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) }

Slide 69

Slide 69 text

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) }

Slide 70

Slide 70 text

[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

Slide 71

Slide 71 text

[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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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); }

Slide 78

Slide 78 text

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); }

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

[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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

Conclusion

Slide 84

Slide 84 text

• Started in 2010 • Object-oriented programming • Support functional programming • Static typing • Type inference • Null safety • Generic programming • Some syntax • Extension • Default implementation

Slide 85

Slide 85 text

&

Slide 86

Slide 86 text

Same word, different concept

Slide 87

Slide 87 text

Swift ͱ Kotlin ͲͪΒ΋ɺଞͷݴޠ͔Βػೳ΍ࢥ૝ΛऔΓೖΕ͍ͯΔ ͦΕΛͦΕͧΕʹݟ߹ͬͨܗͰ༥߹ͤͭͭ͞΋ɺ
 ֤ࣗͷจԽΛங͍͍ͯΔ ڞ௨͢Δ෦෼͸ੜ͡Δ

Slide 88

Slide 88 text

enjoy Swift, enjoy Kotlin :)

Slide 89

Slide 89 text

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/

Slide 90

Slide 90 text

Q & A

Slide 91

Slide 91 text

[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 Έ͍ͨͳڍಈʹͰ͖Δʁ

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

ձ৔Ͱ౴͑ͯͩͬͨ͘͞ @omochimetaru ͞Μɺ
 هࣄΛࣥචɺπΠʔτ͍͖ͨͩ·ͨ͠ @koher ͞Μ
 ͋Γ͕ͱ͏͍͟͝·͢ʂ

Slide 94

Slide 94 text

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: )

Slide 95

Slide 95 text

࣭໰
 inline ࢦఆΛ͢Δ͜ͱʹΑΔϩδο ΫޡΓͷճආΛͲ͏͢Δ͔ ճ౴͸དྷिதʹΞοϓσʔτ͠·͢ʂ ><