Slide 1

Slide 1 text

γ ϯΦ ϒδ ΣΫ ς Ο ϒ $

Slide 2

Slide 2 text

γ ϯ ɾ ε ΢ Ο ϑ τ S W I F T: 5.7 ొஃGSFEEJ؂मTIJ[ ʙ۩ମྫͰֶͿɺ4XJGU͔Βͷzܕz͍ͭͯʙ 88%$&YUFOEFE5PLZP +VOFUI

Slide 3

Slide 3 text

ొஃऀͱ؂मऀ ؂मTIJ[ ొஃGSFEEJ -*/&'VLVPLBגࣜձࣾॴଐ -*/&גࣜձࣾॴଐ

Slide 4

Slide 4 text

BOZΩʔϫʔυͷಋೖ

Slide 5

Slide 5 text

BOZΩʔϫʔυͷಋೖ protocol P {} let value: P any 4&

Slide 6

Slide 6 text

lϓϩτίϧΛܕએݴʹར༻͢Δz w ϓϩτίϧΛܕʢએݴʣͱͯ͠࢖͏ͱଘࡏܕʹͳΔ w lଘࡏܕz͸ɺ&YJTUFOUJBM$POUBJOFSͱ͍͏࢓૊Έ͕ ҉໧తʹಇ͘ protocol P {} let value: P ͜ͷ1͸ଘࡏܕ 4&

Slide 7

Slide 7 text

&YJTUFOUJBM$POUBJOFS w ʮಉ͡ϓϩτίϧಉ࢜ʯͱ͍͏ಛੑΛ࣮ݱ͢ΔzೖΕ෺z w ࣮ߦ࣌ʹಇ͘ͷͰɺ͍··ͰͷίʔυͰͷҙࣝ͸ബ͍ struct A: P {}; struct B: P {} var value: P = A() value = B() ͜ͷ1͸ଘࡏܕ #͸1ʹ४ڌͯ͠ΔͷͰ0, WBMVF͸ଘࡏܕ1Ͱ͋Γɺ1ͷܕΛड͚ೖΕΔίϯςφ 4&

Slide 8

Slide 8 text

ଘࡏܕͱ&YJTUFOUJBM$POUBJOFSͷσϝϦοτ w zೖΕ෺z͸ΦϦδφϧͷܕΑΓ΋αΠζ͕େ͖͍৔߹΋ w ద੾ʹೖΕ෺ͷத਎ʢม਺΍ؔ਺ʣΛݺͼग़ͨ͢Ίͷ ࢓૊Έ͕͋ΔͷͰɺͦͷ෼Φʔόʔϔου͕͋Δ 1 "1 #1 $1 %1˞ ˞ίϯςφΑΓ΋αΠζ͕େ͖͍৔߹ɺͦͷ෼ͷՙ୆Λ૿΍ͯͭ͠ͳ͛ΔΠϝʔδ 4&

Slide 9

Slide 9 text

Ͱ͸ʁ w ٯʹany͕ͳ͍ੈքΛߟ͑ͯΈΔ w ҎԼͷ1ͱ15ZQFͲͪΒ͕௨ৗͷܕએݴͳͷͩΖ͏͔ let value: P let value: PType 4&

Slide 10

Slide 10 text

ݟͨ໨͚ͩͰ͸ʮͲΕ͕ଘࡏܕ͔ʯΘ͔Βͳ͍ w 1͸ϓϩτίϧ15ZQFͷ࣮૷͔΋͠Εͳ͍ w 15ZQF͸ϓϩτίϧ1ͷ࣮૷͔΋͠Εͳ͍ w ࣮૷Λݟʹߦ͚͹Θ͔Δ͕ɺखݩʹͳ͍৔߹͸ʁ 4&

Slide 11

Slide 11 text

ͳͥ1ͱ15ZQF͕໰୊ʹͳΔͷ͔ w ύϑΥʔϚϯεΛٻΊΔͱ͖Λߟ͑Δ w ଘࡏܕʹΑΔύϑΥʔϚϯεͷ௿Լ͸ආ͚͍ͨͷͳΒʁ w ଘࡏܕΛආ͚ͯɺ۩ମతͳܕͰએݴ͍ͨ͠ w ͔͠͠ʜ w 1ͱ15ZQF͸ݟͨ໨্۠ผ͕͔ͭͳ͍ͷ͕໰୊ 4&

Slide 12

Slide 12 text

Ͱ͸any͸Ͳ͏ॿ͚ͯ͘ΕΔͷ͔ GSPN4XJGU w ଘࡏܕʹ͸BOZΛ͚ͭͳ͚Ε͹ͳΒͳ͍ w ଘࡏܕ͕͙͢ʹݟ෼͚ΒΕΔˠΦʔόʔϔουΛ๷͙ ⭕ let value: any P ❌ let value: any PType 4& 5 6

Slide 13

Slide 13 text

BOZͱBTTPDJBUFEUZQF

Slide 14

Slide 14 text

BTTPDJBUFEUZQFͱܕফڈ w BTTPDJBUFEUZQFͷ͋ΔϓϩτίϧΛଘࡏܕͱͯ͠ར༻ w 4XJGU·Ͱ͸ෆՄೳˠͰ͸ՄೳʹͳΔ protocol P { associatedtype T } let value: any P 4&

Slide 15

Slide 15 text

BTTPDJBUFEUZQFͱܕফڈ w Ͱ͸ɺ͍··Ͱ͸Ͳ͏͢Δ΂͖͔ͩͬͨʁ w ࠓ·Ͱܕফڈͱݺ͹ΕΔٕज़͕ඞཁʹ struct AnyP: P where T: P { var p: T init(_ p: T) { self.p = p } } 4&

Slide 16

Slide 16 text

ܕফڈΛࣗલͰߦ͏σϝϦοτ w ϘΠϥʔϓϨʔτίʔυͷ૿࢈ʹͭͳ͕ͬͯ͠·͏ w ফڈ͍ͨ͠ܕ͝ͱʹlܕফڈ༻ͷܕzΛ࡞Δ w Լखʹ࣮૷͢ΔͱΦʔόʔϔου͕૿͑Δ 4&

Slide 17

Slide 17 text

4XJGU͔ΒͷBOZ w BOZBTTPDJBUFEUZQF͕ίϯύΠϧͰ͖ΔΑ͏ʹͳΔ protocol P { associatedtype T } let value: any P ⭕ 4&

Slide 18

Slide 18 text

4XJGU͔ΒͷBOZ w ྫ͑͹ҎԼͷΑ͏ͳ"SSBZ΋ॻ͚Δ class A: P { typealias T = Int } class B: P { typealias T = Double } let array: [any P] = [A(), B()] 4&

Slide 19

Slide 19 text

BOZͷخ͠͞ w ଘࡏܕͱͦͷଞΛݟ෼͚Δࣄ͕Ͱ͖ΔΑ͏ʹ w ίʔυ͔ΒΑΓ໌֬ʹύϑΥʔϚϯεΛҙࣝͰ͖Δ w BTTPDJBUFEUZQF͋Γͷଘࡏܕ͕એݴՄೳʹ w σϝϦοτ΋͋Δࣗલͷܕফڈ͕ෆཁʹͳΔ 4&

Slide 20

Slide 20 text

TPNFͷଟػೳԽ

Slide 21

Slide 21 text

TPNFͱ͸ w TPNF1ͷΑ͏ʹTPNFʴϓϩτίϧͱએݴ͞Εͨܕ͸ 0QBRVF5ZQF ଘࡏܕͱ͸ผ ͱݺ͹ΕΔ some P

Slide 22

Slide 22 text

0QBRVF5ZQFͷϝϦοτ w &YJTUFOUJBM$POUBJOFSΛར༻͠ͳ͍ w Φʔόʔϔου͕গͳ͍ͱ͍͏ϝϦοτ w ฦ٫͢ΔܕΛ࣮૷ऀ͕ҙࣝ͠ͳ͍Α͏ʹͰ͖Δ w ۩ମతͳܕΛ֎ʹग़͢͜ͱ͕ཁٻ͞Εͳ͍ w ͔ͭଘࡏܕͷΑ͏ͳΦʔόʔϔουΛ๷͙ w ྫͱͯ͠4XJGU6*ͷTPNF7JFX

Slide 23

Slide 23 text

͍··ͰͷTPNF w 4XJGU6*ͷTPNF7JFXͷΑ͏ʹBTTPDJBUFEUZQFͷ͋Δ ܕΛฦ٫Ͱ͖ͨ protocol P { associatedtype T } func someFunc() -> some P { PType() // PType conforms P }

Slide 24

Slide 24 text

͜Ε͔ΒͷTPNFͦͷ̍ʢ4XJGUdʣ w ߏ଄తͳܕͷฦ٫ʹ΋ར༻͕ՄೳʹͳΔ w ΑΓந৅౓ͷߴ͍࣮૷Λॻ͘͜ͱ͕Ͱ͖Δ func someFunc() -> [some P] { [PType()] } func someFunc() -> [some Hashable: some P] { [1: PType(), 2: PType()] } 4&

Slide 25

Slide 25 text

͜Ε͔ΒͷTPNFͦͷ̎ʢ4XJGUdʣ w ҎԼͷΑ͏ͳδΣωϦΫεͷ͋Δؔ਺Λߟ͑Δ w ࣮͸ແବ͕ଟ͍ͷͰ͸ͳ͍ͷͩΖ͏͔ func someFunc(arg1: A, arg2: B) { // do smith } 4&

Slide 26

Slide 26 text

͜Ε͔ΒͷTPNFͦͷ̎ʢ4XJGUdʣ w XIFSFʹΑΔBTTDPDJBUFEUZQFͷ੍໿͕ඞཁͳ͍ w TPNFʹΑΔ੍໿Ͱ΋े෼ͳͷͰ͸ͳ͍͔ w δΣωϦΫεͷಛघԽʹΑΔσϝϦοτ someFunc(arg1: A, arg2: B) someFunc(arg1: B, arg2: B) someFunc(arg1: B, arg2: A) ͜ͷΑ͏ͳίʔϧΛͨ͠৔߹ ͭ෼ͷTPNF'VODͷ࣮૷͕ίϯύΠϧ࣌ʹੜ੒ ಛघԽ ΞϓϦͷαΠζ͕ͪΐͬͱ૿͑Δ͔΋ 4&

Slide 27

Slide 27 text

͜Ε͔ΒͷTPNFͦͷ̎ʢ4XJGUdʣ w δΣωϦΫεʹΑΔந৅ΛTPNFͰ୅༻͕Մೳ w ಛघԽ͕ແ͘ɺίϯύΠϧ࣌ʹੜ੒͞ΕΔίʔυ͕ݮগ func someFunc(arg1: some A, arg2: some B) { // do smth } 4&

Slide 28

Slide 28 text

ϓϩτίϧͷlܕύϥϝʔλz

Slide 29

Slide 29 text

BTTPDJBUFUZQFͷlύϥϝʔλԽz w BTTPDJBUFUZQFܕύϥϝʔλͷه๏͕௥Ճ protocol T

{ associatedtype P associatedtype Q } 4&

Slide 30

Slide 30 text

BTTPDJBUFUZQFͷlύϥϝʔλԽz w l੍໿zͱͯ͠ͷར༻͕Մೳʹ w 5ͷBTTPDJBUFEUZQF΁ͷ੍໿͸ԼͷΑ͏ʹॻ͚Δ // ैདྷͷॻ͖ํ func call1(a: G) where G.P == Int, G.Q == Double // ͜Ε͔Βͷॻ͖ํ func call2(a: some T) 4&

Slide 31

Slide 31 text

มߋʹ൐͏ඪ४ϥΠϒϥϦͷมߋ 6OEFS3FWJFX w $PMMFDUJPOͳͲͷϓϩτίϧʹύϥϝʔλΛ௥Ճ ԼهͷΑ͏ͳσϑΥϧτҾ਺͕Մೳ func call(collection: C = [1, 2, 3]) 4&

Slide 32

Slide 32 text

TPNFϓϩτίϧͷύϥϝʔλΛ ར༻ͯ͠ΈΔ

Slide 33

Slide 33 text

"1*3FRVFTUϓϩτίϧ w ҎԼͷΑ͏ͳϓϩτίϧΛར༻ͨ͠"1*ίʔϧΛߟ͍͑ͨ protocol APIRequest { associatedtype Response: Decodable var path: String { get } }

Slide 34

Slide 34 text

"1*3FRVFTU΁ͷ४ڌ w ϢʔβʔͷϦετΛऔΔ"1*ϦΫΤετ struct User: Decodable {} struct GetUserListRequest: APIRequest { typealias Response = [User] var path: String { "/list "} }

Slide 35

Slide 35 text

"1*3FRVFTUΛར༻ͯ͠3FTU"1*Λίʔϧ͢Δؔ਺ w ैདྷͷํ๏Ͱ΍ͬͯΈΔͱҎԼͷΑ͏ʹͳΔ func get(_ request: Request) async throws -> Request.Response

Slide 36

Slide 36 text

"1*3FRVFTUϓϩτίϧͷܕύϥϝʔλ w 4XJGU͔ΒೖΔܕύϥϝʔλΛ࢖ͬͯΈΔ protocol APIRequest { associatedtype Response: Decodable var path: String { get } }

Slide 37

Slide 37 text

"1*3FRVFTUͷܕύϥϝʔλΛར༻ͨؔ͠਺ w ҎԼͷΑ͏ʹͳΔʢ࣮૷͸΄΅ಉ͡Ͱྑ͍ʣ w ͋·ΓมΘͬͯͳ͍Α͏ʹ΋ݟ͑Δ͕ʜ func get(_ request: Request) async throws -> Request.Response ↓ func get(_ request: some APIRequest) async throws -> Response

Slide 38

Slide 38 text

ܕύϥϝʔλΛར༻ͨ͠ʢࠓճͷʣϝϦοτ w ࣮͸ίϯςΩετ͸ൺֱతεοΩϦ͍ͯ͠Δ w 3FTQPOTFδΣωϦΫεͷ੍໿͕ݮগ w 3FTQPOTFͱ"1*3FRVFTUͷؔ܎ੑ͕͸͖ͬΓ func get(_ request: some APIRequest) async throws -> Response

Slide 39

Slide 39 text

·ͱΊ

Slide 40

Slide 40 text

·ͱΊ w BOZͱTPNFपΓͷ4XJGUͷܕͷมߋ w BOZͱ&YJTUFOUJBM$POUBJOFS w QSPUPDPMͷܕύϥϝʔλͱͦͷ۩ମྫ w ঺հͰ͖ͳ͔ͬͨ΋ͷͰॏཁͳ΋ͷ΋͋Δ w Aif let hogeAपΓͷมߋ 4& w ৽͍࣌ؒ͠ͷ֓೦ͷಋೖ 4&

Slide 41

Slide 41 text

ܶऴ 88%$͝ظ଴͍ͩ͘͞