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

20180410_iOSLT_SwiftとProtocol-OrientedProgramming

 20180410_iOSLT_SwiftとProtocol-OrientedProgramming

shtnkgm

April 10, 2018
Tweet

More Decks by shtnkgm

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. Google Trendsʮprotocol-oriented programmingʯ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. UIKitͷΫϥε֊૚

    View Slide

  15. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  20. class Fish {
    }
    class Cat {
    }
    class Dog {
    }
    class Bird {
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. ਌Ϋϥεʹ࣮૷ʁ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  33. View Slide

  34. ӭ͛ͯ૸ΕΔΧΤϧ͸ʁ

    View Slide

  35. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. Protocol Inheritance
    ϓϩτίϧܧঝ

    View Slide

  52. ϓϩτίϧܧঝ΋Մೳ

    View Slide

  53. 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() // ӭ͍ͰਐΈ·͢

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. ϓϩτίϧࢦ޲͍͍Ͷ

    View Slide

  60. ·ͱΊ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  64. ͓ΘΓ

    View Slide