Equatable / Comparable /HashableΛશʹཧղ͢Δ@S_ShimotoriOtemachi.swift x Kyobashi.swift #01
View Slide
ͩΕ• @S_Shimotori·ͨ@S_Shimotori_pub• ֶੜ• DroidKaigi2016-2018ӡӦϝϯόʔ
iOSDCʹొஃ͠·͢• #1349ʮARC vs. GCʁARC in GCʁʯ• 5ͰGCͷΛ͠·͢• ݫ͍͠• Reject͞Εͨͭదʹڙཆ͢ΔͭΓ• ςετ• ԋࢉࢠ• Ͳ͜Ͱʁ
EquatableComparableHashable
͓͞Β͍• Equatable• ͍͔͠Ͳ͏͔ൺֱͰ͖Δ• Comparable• ؔԋࢉࢠͰൺֱͰ͖Δ• ͍͍ͪͪൺֱ༻ͷؔΛ༻ҙ͠ͳͯ͘ιʔτͰ͖Δ• Hashable• ϋογϡΛ࡞ΕΔ• Map/DictionaryͷΩʔʹͳΕΔ• JavaComparableͷΈinterfaceͰΓclass Objectʹੜ͑ͯΔ• Pythonduck typing
SwiftͰ:
EquatableͱΏ͔͍ͳؒͨͪ(Ұ෦লུ)&RVBUBCMF$PNQBSBCMF )BTIBCMF /VNFSJD 4FU"MHFCSB4USJEFBCMF4USJOH1SPUPDPM 3FGFSFODF$POWFSUJCMFFoundationͷࢀরܕଓ͘ɻString͕ଓ͘ɻ1࣍ݩͷ࿈ଓతͳɻUnsafePointer͕ଓ͘ɻೋ߲ࢉज़ԋࢉɻ Set͕ଓ͘ɻ• ͬͱਓؾͳProtocolͷ1ͭ• ͳʹΑΓଘࡏײ͕େ͖͍ɺେ͖͗͢Δ• Equatable.swiftʹͪΌ͔ͬΓಉҰఆͷ࣮͍Δ
protocol Equatable
ͱΓ͋͑ͣ== Λ࣮͢ΕOKʂ❌
protocol Equatableͷཁ݅• ସՄೳੑ• ࣹੑ• ରশੑ• ਪҠੑ• a == b ͕ਅͳΒ not a != b ͕ਅ• ͜ͷ͏ͪEquatable͔ΒϑΥϩʔ͕ೖΔͷ࠷ޙ͚ͩʂ• ҙਤతʹΦʔόʔϥΠυ͠ͳ͍ݶΓ==ͷٯͷ݁ՌΛฦ͢
OptionalͱEquatableͷؔ• OptionalEquatableͰͳ͍• Ͱis Equatableͷ݁Ռதʹґଘ͢Δ• ͰผͰԋࢉࢠ͕࣮͞Ε͍ͯΔͷͰnilͱͷൺֱՄೳ
protocol Comparable
దʹ < Λ࣮͓͚ͯ͠ͳΜͱ͔ͳΔͭ❌
protocol Comparableͷׂͱཁ݅• ܕʹࣗવॱং͚Λ༩͑Δ• σϑΥϧτͷιʔτํ๏ΛܾΊΔͱ͍͏͜ͱ• SwiftؔԋࢉࢠͰදݱ͍ͯ͠ΔͷͰEquatable͕ඞਢ• ࡶʹ࣮͠ͳ͍ݶΓEquatableͱໃ६͠ͳ͍• ࡶʹ࣮͠ͳ͍ݶΓ < = > ͷͲΕ͔1͚͕ͭͩtrueʹͳΔ• strict total orderingͱݺΕΔੑ࣭Λຬͨ͞ͳ͚ΕͳΒͳ͍• ʮ͖ͬͪΓϧʔϧΛܾΊͯશһҰྻʹฒͳ͍ͱͩΊʯ• ුಈখͳͲͰྫ֎͕ೝΊΒΕΔ߹͕͋Δ
sort2छྨ• Ҿͳ͠ͷsort / sorted• ࣗવॱং͚ʹैͬͯιʔτ͢Δ• ͭ·Γཁૉ͕ComparableͰͳ͚ΕͳΒͳ͍• ҾΛऔΔsort / sorted• ରίϨΫγϣϯͷΈͰ௨༻͢Δॱং͚Ͱιʔτ͢Δ• ཁૉ͕ComparableͰͳ͍͍ͯ͘• strict weak orderingͳॱং͚͕ڐ͞ΕΔ• Comparableͱͷҧ͍ൺֱෆೳ͕ڐ͞ΕΔ͜ͱ• ͲͪΒ࠷ޙॱং͚ʹैͬͯΠϯτϩιʔτ͞ΕΔ
protocol Hashable
ͱΓ͋͑ͣϋογϡΛग़͓͚ͯ͠OKʂ❌
protocol Hashable• ϋογϡΛ࣮͢Δͱ͖ͷΑ͋͘Δҙ• ޓ͍ʹಉͳΒϋογϡ͘͠ͳ͚ΕͳΒͳ͍• ٯཱ͠ͳͯ͘Α͔ͬͨΓ͢Δ• SwiftͰEquatableඞਢͳͷͰ࣮ΛΕΔ͜ͱͳ͍ͣ• ϧʔϧʹଇͬͯͪΌΜͱ࣮͢Δ͜ͱʂ
Ҏ্ʂ
͓·͚
assertEqual
assertEqualʹݴޠͷݸੑ͕ग़Δ• Javaʹࢀরܕ༻ͱϓϦϛςΟϒܕ༻͕ͦΕͧΕ༻ҙ͞Ε͍ͯΔ• Pythonʹ1छྨ͔͠ͳ͍• Objective-CΦϒδΣΫτ༻ͱεΧϥ༻͕༻ҙ͞Ε͍ͯΔ• SwiftNonNull༻ͱNullable༻͕༻ҙ͞Ε͍ͯΔ• ࢀরܕͱܕͰͷ۠ผͰͳ͍• ͜ͷ2ͭ΄ͱΜͲҧ͍͕ͳ͍ɺ࣮࣭1छྨɻ
·ͱΊ
·ͱΊ• Equatable / Comparable / Hashableʹϧʔϧ͕͋Δ• ޓ͍ͷؔੑprotocolͷܧঝͰදݱ͞Ε͍ͯΔ͕ɺϧʔϧʹଇ͍ͬͯΔ͔Ͳ͏͔ݟͯ͘Εͳ͍ਖ਼࣮͘͠͠·͠ΐ͏ʂཧΛݴ͑ͦͷςετཉ͘͠ͳ͍ʁ