Swift と Protocol 指向

Af64bc38c0ffcfcabdf430759ee491ce?s=47 Elvis Shi
February 02, 2018

Swift と Protocol 指向

Af64bc38c0ffcfcabdf430759ee491ce?s=128

Elvis Shi

February 02, 2018
Tweet

Transcript

  1. 4XJGUͱ1SPUPDPM0SJFOUFE for αϙʔλʔζ$P-BC

  2. var employedBy = "YUMEMI Inc." var job = "iOS Developer"

    var favoriteLanguage = "Swift" var twitter = "@lovee" var qiita = "lovee" var github = "el-hoshino" var additionalInfo = """ ΏΔΏΔΩϟϯϓ΋͘΋͘ձɺࢀՃऀืूத """ class Me: Developable, Talkable { }
  3. 1SPUPDPM0SJFOUFEͱ͸

  4. 0CKFDU0SJFOUFEͱ͸

  5. ਆ͸ݴͬͨɻੈʹΠοψ͋Εɻ // ਆ͸ݴͬͨɻੈʹΠοψ͋Εɻ struct Dog { // ΠοψΛఆٛ } //

    ਆ͸ݴͬͨɻੈͷΠοψʹ໐͖੠͋Εɻ func shout(dog: Dog) { // Ποψͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print("ʢ∪ʈωʈʣΘΜΘΜ͓ʂ") } let dog = Dog() shout(dog: dog) // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ
  6. ਆ͸ݴͬͨɻੈʹωοί͋Εɻ // ਆ͸ݴͬͨɻੈʹΠοψ͋Εɻ struct Dog { // ΠοψΛఆٛ } //

    ਆ͸ݴͬͨɻੈͷΠοψʹ໐͖੠͋Εɻ func shout(dog: Dog) { // Ποψͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print("ʢ∪ʈωʈʣΘΜΘΜ͓ʂ") } let dog = Dog() shout(dog: dog) // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ // ਆ͸ݴͬͨɻੈʹωοί͋Εɻ struct Cat { // ωοίΛఆٛ } // ਆ͸ݴͬͨɻੈͷωοίʹ໐͖੠͋Εɻ func shout(cat: Cat) { // ωοίͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print("ฅ(=ŋωŋ=)ฅʹΌʔΜ") } let cat = Cat() shout(cat: cat) // ฅ(=ŋωŋ=)ฅʹΌʔΜ ⛭״猺ؤע؆猻نڋٜخ
 寨㡑⦿㧙ק؆׫؂؋؆إ؆נ
  7. 0CKFDU0SJFOUFE 1SPHSBNNJOH

  8. 0CKFDU0SJFOUFE1SPHSBNNJOH ‣ ΦϒδΣΫτࣗମʹػೳΛ࣋ͨͤΑ͏ ‣ ؔ਺͔Βϝιουʢϝοηʔδʣ΁ ‣ ΦϒδΣΫτΛܧঝͰ͖ΔΑ͏ʹ͠Α͏ ‣ ಉ͡ػೳΛ࠶ར༻ ‣

    FUD ‣ ΧϓηϧԽʢந৅Խʣ ‣ ϙϦϞʔϑΟζϜʢଟଶੑʣ ‣ 
  9. ਆ͸ݴͬͨɻੈʹωοί͋Εɻ // ਆ͸ݴͬͨɻੈʹΠοψ͋Εɻ struct Dog { // ΠοψΛఆٛ } //

    ਆ͸ݴͬͨɻੈͷΠοψʹ໐͖੠͋Εɻ func shout(dog: Dog) { // Ποψͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print("ʢ∪ʈωʈʣΘΜΘΜ͓ʂ") } let dog = Dog() shout(dog: dog) // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ // ਆ͸ݴͬͨɻੈʹωοί͋Εɻ struct Cat { // ωοίΛఆٛ } // ਆ͸ݴͬͨɻੈͷωοίʹ໐͖੠͋Εɻ func shout(cat: Cat) { // ωοίͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print("ฅ(=ŋωŋ=)ฅʹΌʔΜ") } let cat = Cat() shout(cat: cat) // ฅ(=ŋωŋ=)ฅʹΌʔΜ ⛭״猺ؤע؆猻نڋٜخ
 寨㡑⦿㧙ק؆׫؂؋؆إ؆נ
  10. ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { var sound: String {

    // ໐͖੠Λఆٛͯ͠ fatalError("Implement Me!") } func shout() { // ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹΠοψ͋ΕɻΠοψ͸ಈ෺Ͱ͋Εɻ class Dog: Animal { // ΠοψΛ࣮૷ override var sound: String { return "ʢ∪ʈωʈʣΘΜΘΜ͓ʂ" } } let dog = Dog() dog.shout() // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ // ਆ͸ݴͬͨɻੈʹωοί͋Εɻωοί͸ಈ෺Ͱ͋Εɻ class Cat: Animal { // ωοίΛ࣮૷ override var sound: String { return "ฅ(=ŋωŋ=)ฅʹΌʔΜ" } } let cat = Cat() cat.shout() //ฅ(=ŋωŋ=)ฅʹΌʔΜ
  11. ਆ͸ݴͬͨɻΠοψ΋ωοί΋ಈ෺Ͱ͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { var sound: String {

    // ໐͖੠Λఆٛͯ͠ fatalError("Implement Me!") } func shout() { // ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } 濕ש⯑׼׭⹻劊׵ب،
 طٖٟ؞٠ٖن؞濕׭ا // ਆ͸ݴͬͨɻੈʹΠοψ͋ΕɻΠοψ͸ಈ෺Ͱ͋Εɻ class Dog: Animal { // ΠοψΛ࣮૷ override var sound: String { return "ʢ∪ʈωʈʣΘΜΘΜ͓ʂ" } } let dog = Dog() dog.shout() // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ // ਆ͸ݴͬͨɻੈʹωοί͋Εɻωοί͸ಈ෺Ͱ͋Εɻ class Cat: Animal { // ωοίΛ࣮૷ override var sound: String { return "ฅ(=ŋωŋ=)ฅʹΌʔΜ" } } let cat = Cat() cat.shout() //ฅ(=ŋωŋ=)ฅʹΌʔΜ
  12. ਆ͸ݴͬͨɻΠοψ΋ωοί΋ಈ෺Ͱ͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { var sound: String {

    // ໐͖੠Λఆٛͯ͠ fatalError("Implement Me!") } func shout() { // ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } عٖو؋▶䕊؆؊؇▶䕊؊
 屢⇗䅡׻ױ؆ק׿׻ئֻ
 㠲㌆憫؋▶䕊״؟؆נ؊؇
 ▶䕊؊ٴِٖٜר㸓׳נר
 ׻؝؇▶䕊خ偺㕠׳׻ئ // ਆ͸ݴͬͨɻੈʹ΢οα͋Εɻ΢οα͸ಈ෺Ͱ͋Εɻ class Rabbit: Animal { // ΢οαΛ࣮૷ override var sound: String { fatalError("΢οα͸໐͔ͳ͍") } } let rabbit = Rabbit() //rabbit.shout() // Fatal error: ΢οα͸໐͔ͳ͍ // ਆ͸ݴͬͨɻੈʹٹٸं͋ΕɻٹٸंʹαΠϨϯ͋Εɻ class Ambulance: Animal { // ٹٸंͷαΠϨϯΛ໐Β͍͚ͨͩ͠ͷͨΊʹAnimalΛܧঝͪ͠Όͬͨ override var sound: String { return "ϐʔϙʔϐʔϙʔ" } } let ambulance = Ambulance() ambulance.shout() //ϐʔϙʔϐʔϙʔ
  13. Animal Cat Dog Rabbit Ambulance 濕׫׭؅
 ▶䕊؃؋؆נ ▶䕊׼׭؅ 濕׭؆נ 濕׫㵀叞

    רמا
  14. Animal Cat Dog Rabbit Ambulance Shoutable Animal RedColorRecog- nizableAnimal 濕׫㵀叞

    恅啓嵮帹㵀叞 濕׭ا׳恅啓؞嵮帹؃שا ׳ק׳⯻撮偺㕠؃ש؆נ ⇓桴؋׶ب
  15. ΦϒδΣΫτࢦ޲͕
 ഁ୼ͨ͠ॠؒͰ͋ͬͨ

  16. 0CKFDU0SJFOUFE1SPHSBNNJOH ‣ ΦϒδΣΫτࢦ޲ͷʮܧঝʯؔ܎͸ຊདྷJTBؔ܎ ‣ αϒΫϥε͸ʮ਌ΫϥεͰ͋Δʯඞཁ͕͋Δ ‣ ਌Ϋϥε͸ຊདྷʮఆٛʯʹઐ೦͢΂͖ ‣ ʮಈ෺ʯΫϥεΛ࡞Δͱ͍͏ͷ͸ɺʮಈ෺ͱ͸Կ͔ʯΛఆٛ͢΂͖ ‣

    શͯͷಈ෺͕͋ΔΘ͚Ͱ͸ͳ͍ʮ໐͘ʯ΍ʮ੺৭ೝࣝʯػೳ͸ɺຊདྷ ʮಈ෺ʯͱͯ͠ͷػೳͰ࣮૷͢΂͖Ͱ͸ͳ͍ ‣ ͳͷʹΈΜͳʮ࢖͏͔ΒʯͱݴͬͯͱΓ͋͑ͣ਌Ϋϥεʹ৭Μͳػೳ ࣋ͨͤ͗͢ ‣ ͍ΘΏΔ(PE$MBTTͷ஀ੜ
  17. 1SPUPDPM0SJFOUFE 1SPHSBNNJOH

  18. https://developer.apple.com/videos/play/wwdc2015/408

  19. 1SPUPDPM0SJFOUFE1SPHSBNNJOH ‣ ϓϩτίϧࢦ޲ͷʮܧঝʢ४ڌʣʯ͸DBOEPؔ܎ ‣ ϓϩτίϧ΁ͷ४ڌ͸ʮͰ͖Δʯ͜ͱΛ͚ࣔͩ͢ ‣ ϓϩτίϧʹ४ڌͨ͠ܕ͕ͳΜͷܕ͔Λؾʹ͢Δඞཁ͕ͳ͍ ‣ ʮ໐͚ΔʯͳΒ໰୊ͳ͍ɺಈ෺ͩΖ͏͔޻ۀ੡඼ͩΖ͏͔ؔ܎ͳ͍ ‣

    DMBTTͰ΋TUSVDUͰ΋FOVNͰ΋ϓϩτίϧʹ४ڌͰ͖Δ ‣ ϓϩτίϧΛ֦ுͰରԠͰ͖ΔͨΊଟॏܧঝʢ४ڌʣ΋໰୊ͳ͍ ‣ ඞཁʹԠͯ͡σϑΥϧτಈ࡞ΛఆٛͰ͖Δ ‣ ඞཁʹԠ࣮ͯ͡ࡍͷܕ৘ใΛอཹͰ͖Δ
  20. ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { var sound: String {

    // ໐͖੠Λఆٛͯ͠ fatalError("Implement Me!") } func shout() { // ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } }
  21. ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } extension؃Self؇ؤا ًغ٠ٽقٌר≠פا
  22. ਆ͸ݴͬͨɻੈʹΠοψ͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹΠοψ͋ΕɻΠοψ͸ಈ෺Ͱ͋Εɻ class Dog: Animal { // ΠοψΛ࣮૷ } // ਆ͸ݴͬͨɻΠοψ͸໐͚ΔΑ͏ʹͳΕɻ extension Dog: ShoutableType { var sound: String { return "ʢ∪ʈωʈʣΘΜΘΜ͓ʂ" } } let dog = Dog() dog.shout() // ʢ∪ʈωʈʣΘΜΘΜ͓ʂ
  23. ਆ͸ݴͬͨɻੈʹωοί͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹωοί͋Εɻωοί͸ಈ෺Ͱ͋Εɻ class Cat: Animal { // ωοίΛ࣮૷ } // ਆ͸ݴͬͨɻωοί͸໐͚ΔΑ͏ʹͳΕɻ extension Cat: ShoutableType { var sound: String { return "ฅ(=ŋωŋ=)ฅʹΌʔΜ" } } let cat = Cat() cat.shout() //ฅ(=ŋωŋ=)ฅʹΌʔΜ
  24. ਆ͸ݴͬͨɻੈʹ΢οα͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹ΢οα͋Εɻ΢οα͸ಈ෺Ͱ͋Εɻ class Rabbit: Animal { // ΢οαΛ࣮૷ } let rabbit = Rabbit() //rabbit.shout() // Compile Error: value of type 'Rabbit' has no member 'shout'
  25. ਆ͸ݴͬͨɻੈʹٹٸं͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹٹٸं͋ΕɻٹٸंʹαΠϨϯ͋Εɻ class Ambulance: ShoutableType { // ٹٸंͷαΠϨϯԻΛఆٛ var sound: String { return "ϐʔϙʔϐʔϙʔ" } func shout() { // ٹٸंͷαΠϨϯͷϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } let ambulance = Ambulance() ambulance.shout() //ϐʔϙʔϐʔϙʔ
  26. ਆ͸ݴͬͨɻੈʹωοί͋Εɻ // ਆ͸ݴͬͨɻੈʹಈ෺͋Εɻಈ෺ʹ໐͖੠͋Εɻ class Animal { // ಈ෺ͷఆٛʹઐ೦ } protocol

    ShoutableType { // ʮ໐͘ʯ͜ͱ͕Մೳͳߏ੒͚ͩΛఆٛ var sound: String { get } func shout() } extension ShoutableType where Self: Animal { // ֦ுͰಈ෺ͷ৔߹ͷσϑΥϧτಈ࡞Λ࣮૷Մೳ func shout() { // ಈ෺ͷ໐͘ϝΧχζϜΛ΄ʹΌΒΒ print(self.sound) } } // ਆ͸ݴͬͨɻੈʹωοί͋Εɻωοί͸ಈ෺Ͱ͋Εɻ class Cat: Animal { // ωοίΛ࣮૷ } // ਆ͸ݴͬͨɻωοί͸໐͚ΔΑ͏ʹͳΕɻ extension Cat: ShoutableType { var sound: String { return "ฅ(=ŋωŋ=)ฅʹΌʔΜ" } } protocol RedColorRecognizableType { // ੺৭ೝࣝʹඞཁͳ΋ͷΛఆٛ } // ਆ͸ߋʹݴͬͨɻωοί͸੺΋ೝࣝͰ͖ΔΑ͏ʹͳΕɻ extension Cat: RedColorRecognizableType { // ੺৭ೝࣝͷͨΊͷ࣮૷Λ΄ʹΌΒΒ }
  27. Animal Cat Dog Rabbit Ambulance Shoutable
 Animal RedColorRecog- nizableAnimal 濕׫㵀叞

    恅啓嵮帹㵀叞 濕׭ا׳恅啓؞嵮帹؃שا
 ׳ק׳⯻撮偺㕠؃ש؆נ ⇓桴؋׶ب
  28. Animal Cat Dog Rabbit Ambulance ShoutableType RedColorRecog- nizableType 濕׫㵀叞 恅啓嵮帹㵀叞

    ؅׿׽؞ ؃שا shout ؃שا
  29. ϓϩτίϧࢦ޲ɺ࠷ߴ

  30. 4XJGUʹ͓͚Δprotocolͷಛ௃ ‣ 4XJGUͷprotocol͸0CK$ͷprotocol΍+BWBͷinterfaceͱ
 ಉ͡Α͏ͳଘࡏ ‣ ͲΕ΋ʮಛఆͷػೳΛ͕࢖͑Δʯ͜ͱΛࣔ͢ͷ͕໨త ‣ ࠓ·ͰओʹσϦήʔτύλʔϯͳͲʹ׆༻͞Ε͍ͯΔ ‣ 4XJGUʢҎ߱ʣͷprotocol͸ΑΓߴػೳ

    ‣ ֦ுͰ۩ମతͳ࣮૷Λ௥ՃͰ͖Δ ‣ SelfʹΑΔδΣωϦΫε͕࢖͑Δ SelfֻⰈⅬּ؄؂؞ⰈⅬ
  31. ΋͠΋protocolʹSelf͕࢖͑ͳ͔ͬͨΒ // ΋͠ Self ͕࢖͑ͳ͔ͬͨΒ… protocol Equatable { func isEqual(to

    another: Equatable) -> Bool } protocol Comparable: Equatable { func isLess(than another: Comparable) -> Bool } struct AStruct { var p: Int }
  32. ΋͠΋protocolʹSelf͕࢖͑ͳ͔ͬͨΒ // ΋͠ Self ͕࢖͑ͳ͔ͬͨΒ… protocol Equatable { func isEqual(to

    another: Equatable) -> Bool } protocol Comparable: Equatable { func isLess(than another: Comparable) -> Bool } struct AStruct { var p: Int } extension AStruct: Equatable { func isEqual(to another: Equatable) -> Bool { guard let another = another as? AStruct else { return false } return self.p == another.p } } extension AStruct: Comparable { func isLess(than another: Comparable) -> Bool { guard let another = another as? AStruct else { fatalError("AStruct ͡Όͳ͔ͬͨΒͳΜͯฦ͢ͷʁ") } return self.p < another.p } }
  33. ͔͠͠4XJGUͷprotocol͸Self͕࢖͑Δʂ // ͔͠͠ Self ͕࢖͑Δʂ protocol Equatable { func isEqual(to

    another: Self) -> Bool } protocol Comparable: Equatable { func isLess(than another: Self) -> Bool } struct AStruct { var p: Int }
  34. ͔͠͠4XJGUͷprotocol͸Self͕࢖͑Δʂ // ͔͠͠ Self ͕࢖͑Δʂ protocol Equatable { func isEqual(to

    another: Self) -> Bool } protocol Comparable: Equatable { func isLess(than another: Self) -> Bool } struct AStruct { var p: Int } extension AStruct: Equatable { func isEqual(to another: AStruct) -> Bool { return self.p == another.p } } extension AStruct: Comparable { func isLess(than another: AStruct) -> Bool { return self.p < another.p } } ⩬㎦⬒ר㹬ױبا؊؃ֻ∺峩؆ـٶٌٛ؋屢إ؆נ
  35. ࣮ࡍͷ4XJGUʹ͓͚ΔEquatableͱComparableͷఆٛ // ࣮ࡍͷ Equatable ͱ Comparable ͷఆٛ protocol Equatable {

    static func == (lhs: Self, rhs: Self) -> Bool } protocol Comparable: Equatable { static func < (lhs: Self, rhs: Self) -> Bool } struct AStruct { var p: Int } extension AStruct: Equatable { static func == (lhs: AStruct, rhs: AStruct) -> Bool { return lhs.p == rhs.p } } extension AStruct: Comparable { static func < (lhs: AStruct, rhs: AStruct) -> Bool { return lhs.p < rhs.p } }
  36. ࣮ࡍͷ4XJGUʹ͓͚ΔEquatableͱComparableͷఆٛ // ࣮ࡍͷ Equatable ͱ Comparable ͷఆٛ protocol Equatable {

    static func == (lhs: Self, rhs: Self) -> Bool } protocol Comparable: Equatable { static func < (lhs: Self, rhs: Self) -> Bool } struct AStruct { var p: Int } extension AStruct: Equatable { static func == (lhs: AStruct, rhs: AStruct) -> Bool { return lhs.p == rhs.p } } extension AStruct: Comparable { static func < (lhs: AStruct, rhs: AStruct) -> Bool { return lhs.p < rhs.p } } let a = AStruct(p: 1) let b = AStruct(p: 2) a < b // true
  37. ϓϩτίϧࢦ޲ɺ࠷ߴ

  38. ΦϒδΣΫτࢦ޲
 ཁΒͳ͍ࢠٙ࿭ʁ

  39. ΦϒδΣΫτࢦ޲ཁΒͳ͍ࢠٙ࿭ʁ ‣ ϓϩτίϧࢦ޲ʢ101ʣͱΦϒδΣΫτࢦ޲ʢ001ʣ͸ڞଘͰ͖Δ ‣ 101͸4XJGU͕ॳΊͯఏএͨ͠ख๏ ‣ 4XJGU͸ϚϧνύϥμΠϜݴޠ ‣ ͦ΋ͦ΋101͸طଘͷ001͕ۤखͳ෦෼Λิ׬͢ΔΑ͏ͳଘࡏ ‣

    ͲͬͪΛબͿͰ͸ͳ͘ɺ͏·͘ڞଘͤ͞Δ ‣ 101ʹΑΓɺੲclassͰ͔͠Ͱ͖ͳ͍ʢͨ͘͞Μͷʣ͜ͱ͕ࠓ protocolͷྗΛआΓͯstruct΍enumͰ΋Ͱ͖ΔΑ͏ʹͳͬͨ ‣ ࢀরܕ͕ඞཁ΍JTBܧঝ͕ඞཁͳ৔߹͸ࠓ·Ͱ௨ΓclassͰ ‣ ஋ܕ͕͍͍৔߹͸struct΍enumͰ ‣ DBOEP४ڌ͸protocolͰ
  40. ϓϩτίϧࢦ޲Ͱɺ
 ޾ͤͳ։ൃΛɻ

  41. http://recruit.yumemi.co.jp גࣜձࣾΏΊΈɺΤϯδχΞืूதɻ

  42. https://connpass.com/event/77930/ ΏΔΏΔΩϟϯϓ΋͘΋͘ձɺࢀՃऀืूதɻ