Slide 1

Slide 1 text

A Deeper Deep dive into Swift Literals freddi from LINE Fukuoka at try! Swift NYC 2019 (9th. Sep)

Slide 2

Slide 2 text

About Me freddi (Yuki Aki) from Developing LINE Creators Studio at LINE Fukuoka Organizer of HAKATA.swift

Slide 3

Slide 3 text

- What is a Literal in Computer Programming? - Why I want you to deep dive into Swift Literals? - Literals in Swift - Object of Literals - Architecture of Type from Literals - Conclusion Agenda High-Level Low-Level

Slide 4

Slide 4 text

What is a Literal in Computer Programming?

Slide 5

Slide 5 text

What is a Literal in Computer Programming? What is a Literal in Computer Programming? Notations for representing a fixed value in source code. Values we write in a conventional form whose is obvious

Slide 6

Slide 6 text

// Integer Literal let assigningIntegerLiteral = 42 // String Literal let assigningStringLiteral = "try! Swift" What is a Literal in Computer Programming?

Slide 7

Slide 7 text

Literal is a minimal way to represent the actual data for Programmer What is a Literal in Computer Programming?

Slide 8

Slide 8 text

Why I want you to deep-dive into Swift Literals?

Slide 9

Slide 9 text

Why I want you to deep-dive into Swift Literals? We have more chances to touch low level Swift compared to Other Languages

Slide 10

Slide 10 text

Why I want you to deep-dive into Swift Literals?

Slide 11

Slide 11 text

But, it is not easy to learn Why I want you to deep-dive into Swift Literals?

Slide 12

Slide 12 text

Compiler Code looks too difficult and is too long for reading Why I want you to deep-dive into Swift Literals?

Slide 13

Slide 13 text

Why I talk about Literals? Why I want you to deep-dive into Swift Literals?

Slide 14

Slide 14 text

Why I talk about Literals? I learned Swift Compiler things through understanding deep side of Swift Literals Why I want you to deep-dive into Swift Literals?

Slide 15

Slide 15 text

Literals in Swift

Slide 16

Slide 16 text

Literals in Swift (Basic Literals) // Integer Literal let assigningIntegerLiteral = 42 // Float Literal let assigningFloatLiteral = 10.0 // String Literal let assigningStringLiteral = "try! Swift" // Boolean Literal let assigningBooleanLiteral = true

Slide 17

Slide 17 text

Representing basic data - Integer Literal → integer numeric - Float Literal → floating numeric - String Literal → sentence - Boolean Literal → true/false Literals in Swift (Basic Literals)

Slide 18

Slide 18 text

Literals in Swift (Basic Literals with nested Type) // Optional from Nil Literal let assigningNilLiteral: Int? = nil // Array Literal let assigningArrayLiteralWithInt: [Int] = [42] // Dictionary Literal let assigningDictLiteral: [String: Int] = [:]

Slide 19

Slide 19 text

Context of Nested Values is necessary - Nil Literal → null value - Array Literal → sequencial value - Dictionary Literal → value with key Literals in Swift (Basic Literals with nested Type)

Slide 20

Slide 20 text

Literals in Swift (Basic Literals with nested Type) // Not declared what type you want to make optional ❌ let assigningNilLiteral = nil // Not declared what element type ❌ let assigningArrayLiteral = []

Slide 21

Slide 21 text

Literals in Swift (Special Literals) // Color Literal let color = #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1) // Image Literal let image = #imageLiteral(resourceName: “cat”) // File Reference Literal let file = #fileLiteral(resourceName: “cat.txt”)

Slide 22

Slide 22 text

Swift also provides Special Literals for resources - Color Literal → color - Image Literal → image - File Reference Literal → file location Literals in Swift (Special Literals)

Slide 23

Slide 23 text

Literals in Swift (Special Literals) Color/Image/File Reference Literal are - rendered as Actual Data in Xcode - File → select from file manager - Color → adjusting color code

Slide 24

Slide 24 text

// Color Literal let color = #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1) Literals in Swift (Special Literals)

Slide 25

Slide 25 text

Literals in Swift (Special Literals at Xcode!) // Color Literal let color =

Slide 26

Slide 26 text

// Color Literal let color = Literals in Swift (Special Literals at Xcode!)

Slide 27

Slide 27 text

// Image Literal let image = #imageLiteral(resourceName: “cat") Literals in Swift (Special Literals)

Slide 28

Slide 28 text

// Image Literal let image = Literals in Swift (Special Literals at Xcode!)

Slide 29

Slide 29 text

// Image Literal let image = Literals in Swift (Special Literals at Xcode!)

Slide 30

Slide 30 text

Literals are a minimal way to represent value by programmer There are many Literals in Swift, not only usual Literal! - Integer, Array, Nil, Color etc… Literals in Swift

Slide 31

Slide 31 text

Object of Literals

Slide 32

Slide 32 text

Object of Literals The Ways of determining Type of value are … - Type Annotation - Type Inference with Default Type of Literal

Slide 33

Slide 33 text

// Integer Literal // assigningIntegerLiteral is Int let assigningIntegerLiteral: Int = 42 Literals get Type from annotation after colon(:) Object of Literals(Type Annotation)

Slide 34

Slide 34 text

// Integer Literal // assigningIntegerLiteral is Float let assigningIntegerLiteral: Float = 42 Literals get Type from annotation after colon(:) Object of Literals(Type Annotation)

Slide 35

Slide 35 text

Object of Literals The Ways of determining Type of value are … - Type Annotation - Type Inference with Default Type of Literal

Slide 36

Slide 36 text

Object of Literals (Type Inference) // Integer Literal // assigningIntegerLiteral is Int let assigningIntegerLiteral = 42 Each Literal has Default Type, can be inferenced

Slide 37

Slide 37 text

Object of Literals (Special Literals) // Image Literal let image = #imageLiteral(resourceName: “cat”) type(of: image) // UIImage at UIKit, NSImage at AppKit AppKit UIKit Image Literal NSImage UIImage Color Literal NSColor UIColor

Slide 38

Slide 38 text

Object of Literals Some Literals are treated as Object which cannot be used Directly

Slide 39

Slide 39 text

Swift’s Compiling Flow 42 SIL(Swift Intermediate Language) Abstract Syntax Tree(AST) AST With Type information

Slide 40

Slide 40 text

Swift’s Compiling Flow 42 SIL(Swift Intermediate Language) Abstract Syntax Tree(AST) AST With Type information Front-End of Compiler Back-End of Compiler

Slide 41

Slide 41 text

42 SIL(Swift Intermediate Language) Abstract Syntax Tree(AST) AST With Type information Swift’s Compiling Flow

Slide 42

Slide 42 text

SIL (Swift Intermediate Language) Intermediate Language between Swift and LLVM IR - Swift code will be converted SIL after AST - Some of optimization are operated at SIL

Slide 43

Slide 43 text

Format of SIL SIL is conforming Static Single Assignment format %a = some value 1 ⭕ %b = some value 2 ⭕ %a = some value 3 ❌ Value - Object is assigned to value at each line - Assigning to one value is allowed only once

Slide 44

Slide 44 text

SIL (Swift Intermediate Language) Why do we need SIL when deep dive into Literals?

Slide 45

Slide 45 text

SIL (Swift Intermediate Language) Why do we need SIL when deep dive into Literals? We can find how Swift Code is treated by Compiler

Slide 46

Slide 46 text

SIL (Swift Intermediate Language) Why do we need SIL when deep dive into Literals? We can find how Swift Code is treated by Compiler More easy to read SIL than reading compiler code

Slide 47

Slide 47 text

Let’s read SIL let assigningLiteral: Int = 42

Slide 48

Slide 48 text

let assigningLiteral: Int = 42 %3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Let’s read SIL

Slide 49

Slide 49 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int let assigningLiteral: Int = 42 Let’s read SIL

Slide 50

Slide 50 text

let assigningLiteral: Int = 42 Allocation of memory to %3 %3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Let’s read SIL

Slide 51

Slide 51 text

$Builtin.Int64 object is assigned %4 %3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int let assigningLiteral: Int = 42 Let’s read SIL

Slide 52

Slide 52 text

At first, Some Literals are … %4 = integer_literal $Builtin.Int64, 42 Literal Object - treated as “Literal Object” starts with $Builtin.*** - $Builtin.*** will be used in Actual Type Initializer

Slide 53

Slide 53 text

%4 = integer_literal $Builtin.Int64, 42 Literal Object At first, Some Literals are … - treated as “Literal Object” starts with $Builtin.*** - $Builtin.*** will be used in Actual Type Initializer Un-official name!;(

Slide 54

Slide 54 text

42 $Builtin.Int64 4.2 $Builtin.FPIEEE64 “42” $Builtin.RawPointer $Builtin.Word Integer Float String Literal Object

Slide 55

Slide 55 text

42 $Builtin.Int64 4.2 $Builtin.FPIEEE64 “42” $Builtin.RawPointer $Builtin.Word Integer Float String let value: Float = 42 Literal Object

Slide 56

Slide 56 text

true $Builtin.Int1 Boolean Digit after $Buildin.Int means bit-size Integer 42 $Builtin.Int64 Literal Object

Slide 57

Slide 57 text

true $Builtin.Int1 Boolean Digit after $Buildin.Int means bit-size Integer 42 $Builtin.Int64 Literal Object

Slide 58

Slide 58 text

#imageLiteral(resourceName: “cat”) UIImage(named: “cat”) Image Literal(at import UIKit) No Literal Object! Literal Object

Slide 59

Slide 59 text

$Builtin.Int64 object is assigned %4 %3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int let assigningLiteral: Int = 42 Let’s read SIL

Slide 60

Slide 60 text

let assigningLiteral: Int = 42 %3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Let’s read SIL $Builtin.Int64 object is assigned %4

Slide 61

Slide 61 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Literal Object (%4) is passed to Int Initializer Let’s read SIL let assigningLiteral: Int = 42

Slide 62

Slide 62 text

Some Type which can be generated from Literal Let’s read SIL - has initializer which receives Literal Object - Initializer of default Type is used, if type not annotated

Slide 63

Slide 63 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Literal Object (%4) is passed to Int Initializer Let’s read SIL let assigningLiteral: Int = 42

Slide 64

Slide 64 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int The generated Int Object is assigned to allocated place let assigningLiteral: Int = 42 Let’s read SIL

Slide 65

Slide 65 text

"try! Swift" Let’s read SIL

Slide 66

Slide 66 text

"try! Swift" %2 = string_literal utf8 "try! Swift" // user: %7 %3 = integer_literal $Builtin.Word, 10 // user: %7 %4 = integer_literal $Builtin.Int1, -1 // user: %7 %5 = metatype $@thin String.Type // user: %7 // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:) %6 = function_ref ... %7 = apply %6(%2, %3, %4, %5) ... Let’s read SIL(from string literal to String)

Slide 67

Slide 67 text

%2 = string_literal utf8 "try! Swift" // user: %7 %3 = integer_literal $Builtin.Word, 10 // user: %7 %4 = integer_literal $Builtin.Int1, -1 // user: %7 %5 = metatype $@thin String.Type // user: %7 // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:) %6 = function_ref ... %7 = apply %6(%2, %3, %4, %5) ... Let’s read SIL(from string literal to String)

Slide 68

Slide 68 text

Let’s read SIL(from string literal to String) %2 = string_literal utf8 "try! Swift" // user: %7 %3 = integer_literal $Builtin.Word, 10 // user: %7 %4 = integer_literal $Builtin.Int1, -1 // user: %7 %2: $Builtin.RawPointer // pointer of string %4: $Builtin.Int1 // flag string is Ascii or not %3: $Builtin.Word // length of data on memory

Slide 69

Slide 69 text

%2 = string_literal utf8 "try! Swift" // user: %7 %3 = integer_literal $Builtin.Word, 10 // user: %7 %4 = integer_literal $Builtin.Int1, -1 // user: %7 %5 = metatype $@thin String.Type // user: %7 // function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:) %6 = function_ref ... %7 = apply %6(%2, %3, %4, %5) ... Let’s read SIL(from string literal to String)

Slide 70

Slide 70 text

// function_ref String.init(_builtinStringLiteral:utf8CodeUnitCount:isASCII:) %6 = function_ref ... %7 = apply %6(%2, %3, %4, %5) ... Let’s read SIL(from string literal to String)

Slide 71

Slide 71 text

Swift Literals are treated as Literal Object at first - Literal Object will be used for Initializers of actual Swift Type Object of Literals %5 = struct $Int (%4 : $Builtin.Int64)

Slide 72

Slide 72 text

Architecture of Type from Literals

Slide 73

Slide 73 text

Literal Object At first, Some Literals are treated as “Literal Object” 42 $Builtin.Int64 4.2 $Builtin.FPIEEE64 “42” $Builtin.RawPointer $Builtin.Word Integer Float String

Slide 74

Slide 74 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Literal Object is passed to Int Initializer Initializer which receives Literal Object

Slide 75

Slide 75 text

Implementation of this initializer is required by _ExpressibleByBuiltin***Literal protocol %5 = struct $Int (%4 : $Builtin.Int64) Initializer which receives Literal Object

Slide 76

Slide 76 text

What is _ExpressibleByBuiltin***Literal protocol? _ExpressibleByBuiltin***Literal

Slide 77

Slide 77 text

What is _ExpressibleByBuiltin***Literal protocol? _ExpressibleByBuiltin***Literal public protocol _ExpressibleByBuiltinIntegerLiteral { init(_builtinIntegerLiteral value: Builtin.IntLiteral) } init(:Builtin.IntLiteral) is called on assigning Literal by = - Type which conforming with this protocol is convertible by Literal Object

Slide 78

Slide 78 text

_ExpressibleByBuiltin***Literal init(:Builtin.IntLiteral) is called on assigning Literal by = %5 = struct $Int (%4 : $Builtin.Int64) What is _ExpressibleByBuiltin***Literal protocol? - Type which conforming with this protocol is convertible by Literal Object

Slide 79

Slide 79 text

ExpressibleBy***Literal You may know ExpressibleBy***Literal protocol - makes Type be convertible by each Literal, using = - ExpressibleByIntegerLiteral - ExpressibleByFloatLiteral - ExpressibleByBooleanLiteral …

Slide 80

Slide 80 text

struct OriginalIntegerType: ExpressibleByIntegerLiteral { typealias IntegerLiteralType = Int init(integerLiteral value: IntegerLiteralType) {} } let value: OriginalIntegerType = 10 ExpressibleBy***Literal How to make Original Type convertible from Literal?

Slide 81

Slide 81 text

struct OriginalIntegerType: ExpressibleByIntegerLiteral { typealias IntegerLiteralType = Int init(integerLiteral value: IntegerLiteralType) {} } let value: OriginalIntegerType = 10 1. Set typealias to IntegerLiteralType the type should be converted from Integer Literal ExpressibleBy***Literal How to make Original Type convertible from Literal?

Slide 82

Slide 82 text

struct OriginalIntegerType: ExpressibleByIntegerLiteral { typealias IntegerLiteralType = Int init(integerLiteral value: IntegerLiteralType) {} } let value: OriginalIntegerType = 10 2. Implement Initializer which receives IntegerLiteralType value ExpressibleBy***Literal How to make Original Type convertible from Literal?

Slide 83

Slide 83 text

struct OriginalIntegerType: ExpressibleByIntegerLiteral { typealias IntegerLiteralType = Int init(integerLiteral value: IntegerLiteralType) {} } let value: OriginalIntegerType = 10 You can initialize your type by Literal! ExpressibleBy***Literal How to make Original Type convertible from Literal?

Slide 84

Slide 84 text

ExpressibleBy***Literal public struct CGFloat { #if arch(i386) || arch(arm) public typealias NativeType = Float #elseif arch(x86_64) || arch(arm64) || … public typealias NativeType = Double ... typealias FloatLiteralType = NativeType CGFloat is using ExpressibleByFloatLiteral

Slide 85

Slide 85 text

struct OriginalIntegerType: ExpressibleByIntegerLiteral { typealias IntegerLiteralType = Int init(integerLiteral value: IntegerLiteralType) {} } let value: OriginalIntegerType = 10 ExpressibleBy***Literal How to make Original Type convertible from Literal? 1. Set typealias to IntegerLiteralType the type should be converted from Integer Literal

Slide 86

Slide 86 text

Associated Type in ExpressibleBy***Literal should conform with _ExpressibleByBuiltin***Literal protocol public protocol ExpressibleByIntegerLiteral { associatedtype IntegerLiteralType: _ExpressibleByBuiltinIntegerLiteral ExpressibleBy***Literal

Slide 87

Slide 87 text

Flow of Converting Literal Literal Object ( = Builtin.***) Swift Type Literal

Slide 88

Slide 88 text

Swift Type Literal Object ( = Builtin.***) Swift Type: _ExpressibleByBuiltin*** Swift Type: ExpressibleBy*** Literal Optional → Flow of Converting Literal

Slide 89

Slide 89 text

_ExpressibleByBuiltin***Literal Please note that … You cannot use _ExpressibleByBuiltin***Literal protocol in your usual Swift Code

Slide 90

Slide 90 text

$Builtin.Int64 $Builtin.FPIEEE64 What is “Literal Object” ??? $Builtin.RawPointer $Builtin.Word Literal Object

Slide 91

Slide 91 text

Literal Object Implementation of this initializer is required by _ExpressibleByBuiltin***Literal protocol %5 = struct $Int (%4 : $Builtin.Int64)

Slide 92

Slide 92 text

Where will passed Literal Object go? %5 = struct $Int (%4 : $Builtin.Int64) Literal Object

Slide 93

Slide 93 text

public struct Int : …… { public var _value: Builtin.Int64 Literal Object will be stored in Some Swift Types from Literal Literal Object

Slide 94

Slide 94 text

// static Int.== infix(_:_:) sil public_external ... (Int, Int, @thin Int.Type) -> Bool { ... %3 = struct_extract %0 : $Int, #Int._value // user: %5 %4 = struct_extract %1 : $Int, #Int._value // user: %5 %5 = builtin "cmp_eq_Int64"(%3 : $Builtin.Int64, %4 : $Builtin.Int64) ... %6 = struct $Bool (%5 : $Builtin.Int1) // user: %7 public var _value: Builtin.Int64 == operator on Int Literal Object

Slide 95

Slide 95 text

// static Int.== infix(_:_:) sil public_external ... (Int, Int, @thin Int.Type) -> Bool { ... %3 = struct_extract %0 : $Int, #Int._value // user: %5 %4 = struct_extract %1 : $Int, #Int._value // user: %5 %5 = builtin "cmp_eq_Int64"(%3 : $Builtin.Int64, %4 : $Builtin.Int64) ... %6 = struct $Bool (%5 : $Builtin.Int1) // user: %7 public var _value: Builtin.Int64 1. Getting _value from left value and right value Literal Object == operator on Int

Slide 96

Slide 96 text

// static Int.== infix(_:_:) sil public_external ... (Int, Int, @thin Int.Type) -> Bool { ... %3 = struct_extract %0 : $Int, #Int._value // user: %5 %4 = struct_extract %1 : $Int, #Int._value // user: %5 %5 = builtin "cmp_eq_Int64"(%3 : $Builtin.Int64, %4 : $Builtin.Int64) ... %6 = struct $Bool (%5 : $Builtin.Int1) // user: %7 public var _value: Builtin.Int64 2. Passing each _value to Back-End function Literal Object == operator on Int

Slide 97

Slide 97 text

Swift Type from Literal Swift’s Compiling Flow Front-End of Compiler Back-End of Compiler $Builtin.*** Back-End Object

Slide 98

Slide 98 text

// static Int.== infix(_:_:) sil public_external ... (Int, Int, @thin Int.Type) -> Bool { ... %3 = struct_extract %0 : $Int, #Int._value // user: %5 %4 = struct_extract %1 : $Int, #Int._value // user: %5 %5 = builtin "cmp_eq_Int64"(%3 : $Builtin.Int64, %4 : $Builtin.Int64) ... %6 = struct $Bool (%5 : $Builtin.Int1) // user: %7 public var _value: Builtin.Int64 3. Return result as Bool in Swift Literal Object == operator on Int

Slide 99

Slide 99 text

Swift Type Literal Object ( = Builtin.***) Swift Type: _ExpressibleByBuiltin*** Swift Type: ExpressibleBy*** Literal Flow of Converting Literal

Slide 100

Slide 100 text

Literal Swift Type: ExpressibleBy*** Swift Type: _ExpressibleByBuiltin*** Literal Object ( = Builtin.***) Architecture of Type from Literals Int, String … CGFloat …

Slide 101

Slide 101 text

Operators(+, -, *, /, == …) Operators(+, -, *, /, == …) Architecture of Type from Literals Back-End Function ift Type: ExpressibleBy*** ype: _ExpressibleByBuiltin*** eral Object ( = Builtin.***) Swift Ty Swift Type: Literal O

Slide 102

Slide 102 text

Some Types generated from Literals are wrappers of Literal Object Literal Object represents object in Back-End Architecture of Type from Literals

Slide 103

Slide 103 text

$Builtin.Int64 Int UInt Architecture of Type from Literals Some Types generated from Literals are wrappers of Literal Object Literal Object represents object in Back-End

Slide 104

Slide 104 text

Some Types generated from Literals are wrappers of Literal Object Literal Object represents object in Back-End Architecture of Type from Literals

Slide 105

Slide 105 text

Some Types generated from Literals are wrappers of Literal Object Literal Object represents object in Back-End Architecture of Type from Literals Swift Type from Literal $Builtin.*** Back-End Object

Slide 106

Slide 106 text

Conclusion

Slide 107

Slide 107 text

Literals in Swift Literals are a minimal way to represent value by programmer There are many Literals in Swift, not only usual Literal! - Integer, Array, Nil, Color etc…

Slide 108

Slide 108 text

Literal Object At first, Some Literals are treated as “Literal Object” 42 $Builtin.Int64 4.2 $Builtin.FPIEEE64 “42” $Builtin.RawPointer $Builtin.Word Integer Float String

Slide 109

Slide 109 text

%3 = global_addr @$s4test16assigningLiteralSivp : $*Int %4 = integer_literal $Builtin.Int64, 42 %5 = struct $Int (%4 : $Builtin.Int64) store %5 to %3 : $*Int Literal Object is passed to Int Initializer Initializer which receives Literal Object

Slide 110

Slide 110 text

Architecture of Type from Literals Literal Swift Type: ExpressibleBy*** Swift Type: _ExpressibleByBuiltin*** Literal Object ( = Builtin.***) Int, String … CGFloat …

Slide 111

Slide 111 text

For more your understanding

Slide 112

Slide 112 text

https://github.com/apple/swift For more your understanding

Slide 113

Slide 113 text

https://www.youtube.com/watch?v=sT0SNp-Tw-8 For more your understanding

Slide 114

Slide 114 text

Swiftckaigi 19th November 2019@Japan For more your understanding

Slide 115

Slide 115 text

Thank you for listening!