Slide 1

Slide 1 text

SwiftͱProtocol-Oriented Programming 2018.4.10 Shota Nakagami / @shtnkgm

Slide 2

Slide 2 text

ຊ೔ͷΰʔϧ ϓϩτίϧࢦ޲Λ஌ͬͯɺ΋ͬͱSwiftyͳΤϯδχΞʹ

Slide 3

Slide 3 text

"Swift is a protocol-oriented language. " — David Abrahams @WWDC2015

Slide 4

Slide 4 text

Google Trendsʮprotocol-oriented programmingʯ

Slide 5

Slide 5 text

ϓϩτίϧΦϦΤϯςουͬͯͳΜͩΖ͏ʁ !

Slide 6

Slide 6 text

Protocol-Oriented Programming: POP • ༁͢ͱϓϩτίϧࢦ޲ϓϩάϥϛϯά • ϓϩτίϧࢦ޲ϓϩάϥϛϯά͸ϓϩάϥϛϯάύϥμΠϜͷ Ұͭ

Slide 7

Slide 7 text

ϓϩάϥϛϯάύϥμΠϜͬͯͳΜͩΖ͏ʁ !

Slide 8

Slide 8 text

Programming Paradigm • ϓϩάϥϛϯάΛ͢Δͱ͖ͷߟ͑ํɺํ๏࿦ͷ͜ͱ • ҰͭͷݴޠͰෳ਺ͷύϥμΠϜʹ෼ྨ͞ΕΔ͜ͱ΋͋Δ ʢ= ϚϧνύϥμΠϜʣ

Slide 9

Slide 9 text

ϓϩάϥϛϯάύϥμΠϜͷҰྫ ϓϩάϥϛϯάύϥμΠϜ ֓ཁ खଓ͖ܕʢProceduralʣ ঢ়ଶΛ࣋ͪɺҰ࿈ͷॲཧΛؔ਺ʹ·ͱΊΔ ΦϒδΣΫτࢦ޲ʢObject-Orientedʣ σʔλ΍ৼΔ෣͍ΛΦϒδΣΫτʹ࣋ͨͤΔ ؔ਺ܕʢFunctionalʣ ঢ়ଶ΍෭࡞༻Λ࣋ͨͳ͍ؔ਺Λ૊Έ߹ΘͤΔ ϦΞΫςΟϒʢReactiveʣ σʔλͷྲྀΕʢdata flowʣͱσʔλͷมԽͷ ఻೻ʹண໨ δΣωϦοΫʢGenericʣ σʔλܗࣜʹґଘ͠ͳ͍ ΞεϖΫτࢦ޲ʢAspect-Orientedʣ ԣஅతؔ৺ࣄͷ෼཭ʹண໨

Slide 10

Slide 10 text

iOSΞϓϦ։ൃ͸ϚϧνύϥμΠϜ • Objective-CɾɾɾΦϒδΣΫτࢦ޲ • Swiftɾɾɾϓϩτίϧࢦ޲ ʢΦϒδΣΫτࢦ޲&ؔ਺ܕ&δΣωϦοΫʣ • ಛʹɺUIKit͸ΦϒδΣΫτࢦ޲ͱͷؔΘΓ͕ڧ͍

Slide 11

Slide 11 text

ΦϒδΣΫτࢦ޲ͬͯͳΜ͚ͩͬʁ

Slide 12

Slide 12 text

ΦϒδΣΫτࢦ޲ͷ͓͞Β͍

Slide 13

Slide 13 text

Object-Oriented Programming: OOP • σʔλ΍ϝιουΛ࣋ͬͨΦϒδΣΫτΛͭͬͯͦ͘ͷ૬ޓ࡞ ༻ͰγεςϜΛܗ࡞Δ • ΦϒδΣΫτࢦ޲ͷࡾݪଇ • ϙϦϞʔϑΟζϜʢଟଶੑʣ • ΧϓηϧԽʢӅṭʣ • ܧঝ

Slide 14

Slide 14 text

UIKitͷΫϥε֊૚

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

ΦϒδΣΫτࢦ޲ͱϓϩτίϧࢦ޲

Slide 17

Slide 17 text

Swift Standard Framework͸΄΅ߏ଄ମͰߏ੒ ओͳߏ੒ཁૉ ΦϒδΣΫτࢦ޲ ϓϩτίϧࢦ޲ ܕ ࢀরܕʢClassʣ ஋ܕʢStruct/Enumʣ ந৅Խ Superclass Protocol →Obective-C࣌୅ͷΫϥεͷར༻͔Βߏ଄ମͷར༻͕த৺ʹ

Slide 18

Slide 18 text

ΦϒδΣΫτࢦ޲Ͱʮಈ෺ʯΛσβΠϯͯ͠ΈΔ

Slide 19

Slide 19 text

͍ΖΜͳಈ෺ΫϥεΛͭ͘Γ·͢

Slide 20

Slide 20 text

class Fish { } class Cat { } class Dog { } class Bird { }

Slide 21

Slide 21 text

Ͳͷಈ෺΋͝͸ΜΛ৯΂Δ →ॲཧΛڞ௨Խ͍ͨ͠

Slide 22

Slide 22 text

class Fish { func eat() { /* something */ } } class Cat { func eat() { /* something */ } } class Dog { func eat() { /* something */ } } class Bird { func eat() { /* something */ } }

Slide 23

Slide 23 text

਌Ϋϥεʹڞ௨ॲཧΛ࣮૷ͯ͠ܧঝ

Slide 24

Slide 24 text

class Animal { func eat() { /* something */ } } class Fish: Animal { } class Cat: Animal { } class Dog: Animal { } class Bird: Animal { }

Slide 25

Slide 25 text

Ҡಈํ๏΋·ͱΊΒΕͦ͏ʁ

Slide 26

Slide 26 text

਌Ϋϥεʹ࣮૷ʁ

Slide 27

Slide 27 text

class Animal { func eat() { /* something */ } func swim() { /* something */ } func run() { /* something */ } func fly() { /* something */ } } class Dog: Animal { } let dog = Dog() dog.fly()

Slide 28

Slide 28 text

class Animal { func eat() { /* something */ } func swim() { /* something */ } func run() { /* something */ } func fly() { /* something */ } } class Dog: Animal { } let dog = Dog() dog.fly()

Slide 29

Slide 29 text

ۭඈͿ͍͵͕ൃੜʢόάʣ

Slide 30

Slide 30 text

Ҡಈํ๏ʹ͍ͭͯͷந৅֓೦Λ࣮૷

Slide 31

Slide 31 text

ΑΓ҆શͳϓϩάϥϜʹ class Animal { func eat() { /* something */ } } class RunAnimal: Animal { func run() { /* something */ } } class Dog: RunAnimal { } let dog = Dog() dog.run() // OK dog.fly() // ίϯύΠϧΤϥʔ

Slide 32

Slide 32 text

ʊਓਓਓਓਓਓਓਓਓʊ ʼɹಥવͷ࢓༷มߋɹʻ ʉY^Y^Y^Y^Y^Y^Y^Yʉ

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

ӭ͛ͯ૸ΕΔΧΤϧ͸ʁ

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

Ϋϥε͸ଟॏܧঝΛαϙʔτ͍ͯ͠ͳ͍ // error: multiple inheritance from classes 'SwimAnimal' and 'RunAnimal' class Frog: SwimAnimal, RunAnimal { }

Slide 37

Slide 37 text

Ϋϥεͷܧঝʹؔ͢Δ໰୊ᶃ • ୯Ұʢ୯७ʣܧঝ͔͠Ͱ͖ͳ͍ͷͰɺΫϥεઃܭ͕೉͍͠ ɹˠ਌Ϋϥε͕ංେԽɺڽू౓͕௿͘ͳΓ͕ͪʢͪ͝Ό·ͥʣ

Slide 38

Slide 38 text

Ϋϥεͷܧঝʹؔ͢Δ໰୊ᶄ • ਌Ϋϥεͷมߋ͕શͯͷܧঝઌΫϥεʹ೾ٴ͢Δ ɹ →όάͷݪҼɺ਌Ϋϥε͸มߋ͠ʹ͍͘

Slide 39

Slide 39 text

Ϋϥεͷܧঝʹؔ͢Δ໰୊ᶅ • ந৅֓೦΋ΠϯελϯεԽͰ͖ͯ͠·͏ →όάͷݪҼ // ۩৅ΫϥεͷΠϯελϯεԽ let dog = Dog() let frog = Frog() // ந৅ΫϥεͷΠϯελϯεԽ let animal = Animal() // ͲΜͳಈ෺ʁ

Slide 40

Slide 40 text

Ϋϥεͷܧঝʹؔ͢Δ໰୊ᶆ • ΦʔόʔϥΠυલఏͷϝιου class Animal { func bark() { // ಈ෺ͱ͍͏֓೦͸ͳΜͯ໐͘?? // // } }

Slide 41

Slide 41 text

Ϋϥεͷܧঝʹؔ͢Δ໰୊ᶆ • ΦʔόʔϥΠυલఏͷϝιου class Animal { func bark() { // ಈ෺ͱ͍͏֓೦͸ͳΜͯ໐͘?? // ΦʔόʔϥΠυ͞Εͳ͍৔߹͸Ϋϥογϡͤ͞Δ͔... fatalError() } } ܧঝઌͰͷ࣮૷࿙Ε͕͋Δͱόάͷݩʹ

Slide 42

Slide 42 text

ϓϩτίϧࢦ޲Ͱʮಈ෺ʯΛσβΠϯͯ͠ΈΔ

Slide 43

Slide 43 text

Protocol Conformance ϓϩτίϧ४ڌʢద߹ʣ

Slide 44

Slide 44 text

ੑ࣭ΛϓϩτίϧͰදݱͯ͠४ڌ

Slide 45

Slide 45 text

protocol Eatable { func eat() } struct Cat: Eatable { // eatϝιουͷ࣮૷͕ڧ੍͞ΕΔ // ίϯύΠϥͰνΣοΫ͞ΕΔͷͰ҆શ func eat() { print("ͺ͘ͺ͘") } }

Slide 46

Slide 46 text

Protocol Extension ϓϩτίϧΤΫεςϯγϣϯʢ֦ுʣ

Slide 47

Slide 47 text

ϓϩτίϧΤΫεςϯγϣϯͰσϑΥϧτ࣮૷ protocol Eatable { func eat() } extension Eatable { func eat() { print("΋͙΋͙") } } struct Dog: Eatable { } let dog = Dog() dog.eat() // ΋͙΋͙

Slide 48

Slide 48 text

Protocol Composition ϓϩτίϧίϯϙδγϣϯʢ߹੒ʣ

Slide 49

Slide 49 text

ෳ਺ϓϩτίϧ४ڌͰΧΤϧ໰୊ղফ

Slide 50

Slide 50 text

struct Frog: Swimmable, Runnable { } let frog = Frog() frog.swim() frog.run()

Slide 51

Slide 51 text

Protocol Inheritance ϓϩτίϧܧঝ

Slide 52

Slide 52 text

ϓϩτίϧܧঝ΋Մೳ

Slide 53

Slide 53 text

protocol Movable { func move(method: String) } extension Movable { func move(method: String) { print(method + "ਐΈ·͢") } } protocol Swimmable: Movable { func swim() } extension Swimmable { func swim() { move(method: "ӭ͍Ͱ") } } struct Fish: Swimmable { } let fish = Fish() fish.swim() // ӭ͍ͰਐΈ·͢

Slide 54

Slide 54 text

͞ΒʹFlyableΛಈ෺Ͱͳ͍ܕͰ४ڌ • e.g. ඈߦػ • ඈͿͱ͍͏ੑ࣭͔Βઃܭ͢Δ͜ͱͰɺಈ෺ʹ΋ґଘ͠ͳ͍ • ॊೈͰ֦ுੑͷ͋ΔϓϩάϥϜʹͳΔ

Slide 55

Slide 55 text

ϓϩτίϧ͸஋ܕͰ΋࢖͑Δ • ஋ܕͷStruct΍Enumʹ͸ΫϥεͷΑ͏ͳܧঝػೳ͸ͳ͍͕ɺϓ ϩτίϧʹ͸४ڌͰ͖Δ • ஋ܕ͸ࢀরܕʢΫϥεʣΑΓ΋҆શ • ஋Λڞ༗͠ͳ͍ͷͰҙਤ͠ͳ͍஋ͷมߋ͕ൃੜ͠ͳ͍ • εϨουηʔϑ • ॥؀ࢀর໰୊͕ൃੜ͠ͳ͍

Slide 56

Slide 56 text

ϓϩτίϧ͸ܕͱͯ͠ѻ͑Δ • ϙϦϞʔϑΟζϜͰૄ݁߹ʹ ! func feed(eatable: Eatable) • ΠϯελϯεԽෆՄ ! // Error: Protocol type 'Eatable' cannot be instantiated let eatable = Eatable()

Slide 57

Slide 57 text

δΣωϦΫεʢ૯শܕʣ΋࢖͑Δ Ϋϥε΍StructͷΑ͏ͳܕύϥϝʔλ͸࢖͑ͳ͍͕ɺ associatedtypeͰ૯শܕΛఆٛͰ͖Δ class Eatable { } struct Eatable { } protocol Eatable { associatedtype FoodType }

Slide 58

Slide 58 text

protocol Eatable { associatedtype FoodType func eat(food: FoodType) } struct Bird: Eatable { typealias FoodType = Fish func eat(food: FoodType) { // do something } }

Slide 59

Slide 59 text

ϓϩτίϧࢦ޲͍͍Ͷ

Slide 60

Slide 60 text

·ͱΊ

Slide 61

Slide 61 text

࠷ڧͷϓϩάϥϛϯάύϥμΠϜ͸ͳ͍ • ͲΕ΋໰୊ղܾͷखஈͷҰͭʹ͗͢ͳ͍ • ϓϩτίϧࢦ޲Λ஌Δ͜ͱͰϓϩάϥϛϯάͷ෯͕޿͕Δ • ͍ΖΜͳํ๏࿦Λ஌Γɺదࡐదॴ࢖͑Δͷ͕࠷ڧ

Slide 62

Slide 62 text

ΦϒδΣΫτࢦ޲ ϓϩτίϧࢦ޲ σʔλͷ҉໧తڞ༗ ×ʢ͋Γʣ ○ʢͳ͠ʣ ந৅Խ ○ʢSuperclassʣ ○ʢProtocolʣ ίϯϙδγϣϯ ×ʢͰ͖ͳ͍ʣ ○ʢProtocol Compositionʣ ந৅ܕͷΠϯελϯεԽ ×ʢͰ͖Δʣ ○ʢͰ͖ͳ͍ʣ σϑΥϧτ࣮૷ ○ʢSuperclassʣ ○ʢProtocol Extensionʣ ۩৅ܕ΁ͷ࣮૷ͷڧ੍ ×ʢಈతνΣοΫʣ ○ʢ੩తνΣοΫʣ ϙϦϞʔϑΟζϜ ○ʢSuperclassʣ ○ʢProtocolʣ δΣωϦΫε ○ʢܕύϥϝʔλʣ ○ʢassociatedtypeʣ UIKitΦϒδΣΫτͷܧঝ ○ʢͰ͖Δʣ ×ʢͰ͖ͳ͍ʣ ϥΠϑαΠΫϧ؅ཧʢdeinitʣ ○ʢ͋Γʣ ×ʢͳ͠ʣ Ұҙੑͷ͋Δσʔλʢsingletonʣ ○ʢ࡞Γ΍͍͢ʣ ×ʢ࡞Γʹ͍͘ʣ

Slide 63

Slide 63 text

ΑΓৄ͘͠ • WWDC2015ηογϣϯಈը Protocol-Oriented Programming in Swift / WWDC2015 • ެࣜϦϑΝϨϯε Protocols / The Swift Programming Language (Swift 4.1) • ॻ੶ Swift 4 Protocol-Oriented Programming - Third Edition

Slide 64

Slide 64 text

͓ΘΓ