Slide 1

Slide 1 text

Opaque Result Typeͷղઆ omochimetaru Θ͍Θ͍swiftc #11 1

Slide 2

Slide 2 text

5ඵͳΒ 2

Slide 3

Slide 3 text

͜ΕΛݟͯ Proposal SE-0244 Opaque Result Type https://github.com/apple/swift-evolution/blob/ master/proposals/0244-opaque-result-types.md 3

Slide 4

Slide 4 text

͜ΕΛݟͯ Swift 5.1 ʹಋೖ͞ΕΔ Opaque Result Type ͱ͸ Կ͔ https://qiita.com/koher/items/ 338d2f2d0c4731e3508f 4

Slide 5

Slide 5 text

ղઆ͢ΔͳΒ 5

Slide 6

Slide 6 text

Opaque Result Type ύϑΥʔϚϯεΛอͪͭͭɺ ਅͷܕΛӅṭ͢Δ৽ػೳ 6

Slide 7

Slide 7 text

ಈػ 7

Slide 8

Slide 8 text

ਅͷܕΛӅṭ ʮ͋ΔϓϩτίϧΛฦ͢ʯͱݴ͍͍ͨ͜ͱ͕͋Δ func loadUsers() -> ??? // Sequence of User 8

Slide 9

Slide 9 text

۩ମతͳܕΛฦͯ͠͠·͏ͱকདྷมߋͰ͖ͳ͍ // ver 1.0.0 func loadUsers() -> [User] // ver 1.1.0 func loadUsers() -> LazySequence 9

Slide 10

Slide 10 text

ैདྷͷํ๏ Type Erasure΍ExistentialͰฦ͢ func loadUsers() -> AnySequence • ܕͷਖ਼͠͞Λଛͳ͏ • ύϑΥʔϚϯεΛଛͳ͏ 10

Slide 11

Slide 11 text

ܕͷਖ਼͠͞Λଛͳ͏ let a = AnyCollection(["hello"]) let b = AnyCollection("hello") let c = b[a.startIndex] ࣮ߦ࣌(!)Τϥʔ Collection.Indexʹؔ͢Δܕ৘ใ͕ࣦΘΕ͍ͯ Δ 11

Slide 12

Slide 12 text

ॻ͖ࠐΈ protocol P {} extension Int : P {} struct Container { var value: P { get { return _value } set { _value = newValue as! Int } } var _value: Int = 1 } ࣮࣭తʹsuper typeͳͷͰɺcontravarianceϙδγϣϯͰյ ΕΔ 12

Slide 13

Slide 13 text

ύϑΥʔϚϯεΛଛͳ͏ ϥούʔʹแ·ΕͯΔ෼஗͍ 13

Slide 14

Slide 14 text

ղܾํ๏ 14

Slide 15

Slide 15 text

Opaque Result Type some P ʮϓϩτίϧPΛຬͨ͢ԿΒ͔ͷܕʯΛද͢ه๏ 15

Slide 16

Slide 16 text

ؔ਺ͷฦΓ஋Ͱ࢖͑Δ extension Int : P {} func getP() -> some P { return 3 } 16

Slide 17

Slide 17 text

ϓϩύςΟͰ࢖͑Δ var propertyP: some P { get { ... } set { ... } } 17

Slide 18

Slide 18 text

associated type͕͍ͭͯͯ΋࢖͑Δ func numbers() -> some MutableCollection { return [1, 2, 3] } var xs = numbers() let i0 = xs.startIndex let i1 = xs.index(after: i0) xs[i0] = xs[i1] print(xs) // [2, 2, 3] 18

Slide 19

Slide 19 text

͕͜͜ϛι 2ͭͷsome P͸ҧ͏ܕ func f1() -> some P func f2() -> some P var a = f1() let b = f2() a = b // ίϯύΠϧΤϥʔ 19

Slide 20

Slide 20 text

ORT͸ؔ਺୯ҐͷΞΠσϯςΟςΟΛ࣋ͭ ԼهͷΑ͏ͳঢ়ଶΛ૝૾͢Δͱྑ͍ struct ResultOfF1 : P {} func f1() -> ResultOfF1 struct ResultOfF2 : P {} func f2() -> ResultOfF2 var a = f1() let b = f2() a = b // ίϯύΠϧΤϥʔ 20

Slide 21

Slide 21 text

ORTͷந৅Խදݱ some Pͱͯ͠ҙຯ෇͚͞ΕΔͨΊɺকདྷͷόʔ δϣϯͰਅͷܕΛมߋͰ͖Δ ιʔεޓ׵ੑ͚ͩͰ͸ͳ͘ɺόΠφϦޓ׵ੑ͕͋ Γɺ࠶ίϯύΠϧͤͣʹมߋͰ͖Δ // ver 1.0.0 func f() -> some P { return 3 } // ver 1.1.0 func f() -> some P { return "3" } 21

Slide 22

Slide 22 text

໰୊ͷղܾΛΈ͍ͯ͘ • ܕ৘ใͷอ࣋ • ॻ͖ࠐΈ • ύϑΥʔϚϯε 22

Slide 23

Slide 23 text

ܕ৘ใͷอ࣋ func numbers() -> some Collection { return [1, 2, 3] } func message() -> some Collection { return "hello" } let a = numbers() let b = message() let x = a[b.startIndex] // ܕΤϥʔ 23

Slide 24

Slide 24 text

ॻ͖ࠐΈՄೳ struct S { var value: some P { get { return _value } set { _value = newValue as! Int } } var _value: Int = 3 } var s = S() let x = s.value s.value = x // OK s.value = Int(1) // Error s.value = "hello" // Error 24

Slide 25

Slide 25 text

ύϑΥʔϚϯε ίϯύΠϥ͕ਅͷܕΛ஌͍ͬͯΔ࣌͸ɺ࠷దԽʹ ΑΓਅͷܕͱͯ͠ѻ͏ίʔυʹಛघԽ͞ΕΔͨ ΊɺෆཁͳύϑΥʔϚϯεϩε͕ແ͍ 25

Slide 26

Slide 26 text

ʮ࠷దԽͰ͖Δͱ͖͸଎͍ʯͱ͍͏ҙຯͰ͸ Existentialͱಉ͡ɻԿ͕ҧ͏ͷ͔ʁ Existential͸super typeͰ͋ΔͨΊɺʮଞͷܕ͕ ೖ͍ͬͯΔՄೳੑ͕ͳ͍ʯূ໌͕ඞཁɻ ORT͸ʮ஌Βͳ͍͋ΔܕʯͳͷͰɺͦͷূ໌͸ෆ ཁɻ୯ʹͦͷਅͷܕΛ஌Ε͹ྑ͍͚ͩɻ ݁Ռͱͯ͠ಉҰϞδϡʔϧͳΒৗʹ࠷దԽՄೳɻ 26

Slide 27

Slide 27 text

ൃల 27

Slide 28

Slide 28 text

ORTͷಋೖʹ͋ͨͬͯٞ࿦͕֦େ͍ͯͬͨ͠ɻ ऩरΛ͚ͭΔͨΊ৽͍͠ϚχϑΣετ͕࡞ΒΕ ͨɻ Improving the UI of generics https://forums.swift.org/t/improving-the-ui-of- generics/22814 Generic Manifestoʹଓ͘ࢦ਑ 28

Slide 29

Slide 29 text

ORT͸δΣωϦΫεͱࣅ͍ͯΔ // PͰ͋ΔਅͷܕΛฦ͢ func makeSomeP() -> some P // PͰ͋ΔਅͷܕXΛड͚औΔ func useGeneP(_ x: X) 29

Slide 30

Slide 30 text

͜Εͱ͸ҧ͏ // PͰ͋ΔਅͷܕXΛฦ͢ func makeGeneP() -> X ͜ͷX͸ݺͼग़͠ଆ͕ܾΊΔ some P͸ݺͼग़͞Εଆ͕ܾΊΔ 30

Slide 31

Slide 31 text

Reverse Generics ݺͼग़͞Εଆ͕ܾΊΔδΣωϦοΫύϥϝʔλͱ ͍͏৽֓೦Λߟ͑ͯΈΔ func makeRevGeneP() -> X 31

Slide 32

Slide 32 text

ORT͸Reverse GenericͷsugarͱΈͳͤΔ // PͰ͋ΔਅͷܕΛฦ͢ func makeSomeP() -> some P // PͰ͋ΔਅͷܕXΛฦ͢ func makeRevGeneP() -> X 32

Slide 33

Slide 33 text

Reverse GenericsΛ࢖͏ͱɺදݱྗ্͕͕Δ // 2ͭͷsome Pͷؔ࿈Λॻ͚ͳ͍ func makePS() -> (some P, some P) // 2ͭͷʮಉҰͷʯPΛຬͨ͢ܕ func makePS() -> (X, X) 33

Slide 34

Slide 34 text

ORTߏจͷ֦ுҊ func makePS() -> (some P A, some P B) where A == B 34

Slide 35

Slide 35 text

Opaque Result Type → Reverse Generics ?? → Generics 35

Slide 36

Slide 36 text

Opaque Argument Type ΋͠someΛҾ਺෦෼ʹॻ͚ͨΒɺGenericsͷ sugarͱΈͳͤΔ // PͰ͋ΔਅͷܕΛड͚औΔ func useSomeP(_ x: some P) // PͰ͋ΔਅͷܕXΛड͚औΔ func useGeneP(_ x: X) 36

Slide 37

Slide 37 text

// PͰ͋ΔਅͷܕΛड͚औΔ func useSomeP(_ x: some P) // PͰ͋ΔਅͷܕXΛड͚औΔ func useGeneP(_ x: X) ಄ͷதͰҰ౓XΛهԱ͠ͳ͍ͷͰಡΈ΍͍͢ɺྲྀ ߦΓͦ͏ 37

Slide 38

Slide 38 text

ORTͱExistential Α͘ࣅ͍ͯΔ // PΛຬͨ͢**ͱ͋Δ**ܕΛฦ͢ func makeSomeP() -> some P // PΛຬͨ͢**ͲΜͳ**ܕͰ΋୅ೖͰ͖Δ var b: P = ... 38

Slide 39

Slide 39 text

Existentialͷanyه๏ // PΛຬͨ͢**ͱ͋Δ**ܕΛฦ͢ func makeSomeP() -> some P // PΛຬͨ͢**ͲΜͳ**ܕͰ΋୅ೖͰ͖Δ var b: any P ରশతͰ͖Ε͍ 39

Slide 40

Slide 40 text

Protocol੍໿ͱExistentialͷྨࣅ ॳڃऀࡴ͠ // P͸੍໿ func useGeneP(_ x: X) // P͸Existential func useAnyP(_ x: P) 40

Slide 41

Slide 41 text

ҧ͏ػೳ͸ҧ͏ه๏ͷ΄͏͕Θ͔Γ΍͍͢ // P͸੍໿ func useGeneP(_ x: X) // P͸Existential func useAnyP(_ x: any P) 41