2017/04/13(木) Potatotips #39
[SE-0160]Limiting @objcinferenceDaiki Matsudate (@d_date)potatotips #39
View Slide
Agenda• ͱͯ140จࣈͰπΠʔτͰ͖ͳ͍• [SE-0160] Limiting @objc inferenceʹ͍ͭͯ͠·͢ɻ
[SE-0160] @objcਪͷ੍ݶ• https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
@objc in Swift 3.x• Objective-CͰݺͼग़ͤΔͷʹ͍ͭͯɺSwiftଆͰ໌ࣔతʹએݴͰ͖Δ• Θ͟Θ͟@objcΛॻ͔ͳ͍͍ͯ͘Α͏ʹਪͯ͘͠ΕΔ
@objc in Swift 3.x ͷ• Objective-CͰݺͼग़ͤΔͷʹ͍ͭͯɺSwiftଆͰ໌ࣔతʹએݴͰ͖Δ• Θ͟Θ͟@objcΛॻ͔ͳ͍͍ͯ͘Α͏ʹਪͯ͘͠ΕΔ → աͰʁʁ
@objc in Swift 3.x ͷ• SwiftͷΫϥεObjective-CͷSelectorͷিಥΛҾ͖ى͕ͪ͜͠
@objc in Swift 3.x ͷ• Swift API Design GuidelineʹԊͬͯॻ͍ͯɺObjective-CͰݺͼग़͢ͱ͖ʹObjective-CCoding Guidelineʹ͢Δ໊લʹม͞Ε͕ͪɻಛʹɺinitializerɺͦͷ໊લʹୈҰҾΛؚΊͳ͍͚ͯ͘ͳ͍ͷͰɺ@objcඞ͚ͣͭΔ͜ͱʹͳΔɻ
• SwiftίϯύΠϥObjective-C CallingConvention͔ΒSwift Calling Conventionม͢Δ"thunk"ϝιουΛ࡞ΔͨΊɺόΠφϦαΠζ͕૿େ͢Δɻ@objc in Swift 3.x ͷ
@objc in future
@objc in futureObjective-CͰඞཁͳͱ͜Ζ͚ͩʹ@objcΛ͚ͭΔΑ͏ʹਪΛݮΒ͢ʲํʳ
Ҿ͖ଓ͖@objcΛਪ͢Δͷ[email protected]ͷ͍͍ͭͯΔએݴͷΦʔόʔϥΠυͷͱ͖
Ҿ͖ଓ͖@objcΛਪ͢Δͷ2. @objcͷ͍ͭͨϓϩτίϧͷཁ݅Λຬͨ͢ͱ͖
Ҿ͖ଓ͖@objcΛਪ͢Δͷ3. @IBOutlet,@IBActionଐੑ͕͍͍ͭͯΔͱ͖4. @NSManagedଐੑ͕͍͍ͭͯΔͱ͖Interface BuilderͱͷΠϯλϥΫγϣϯ͕Objective-CϥϯλΠϜͰߦΘΕΔͨΊCore DataͱͷΠϯλϥΫγϣϯ͕Objective-CϥϯλΠϜͰߦΘΕΔͨΊ
ՃͰ@objcΛਪ͢Δͷ1. @GKInspectableଐੑ͕͍͍ͭͯΔͱ͖2. @IBInspectableଐੑ͕͍͍ͭͯΔͱ͖GameplayKitͱͷΠϯλϥΫγϣϯ͕Objective-CϥϯλΠϜͰߦΘΕΔͨΊInterface BuilderͱͷΠϯλϥΫγϣϯ͕Objective-CϥϯλΠϜͰߦΘΕΔͨΊ
@objcΛਪ͠ͳ͘ͳΔͷ1. dynamic
@objcΛਪ͠ͳ͘ͳΔͷ2. NSObject༝དྷͷΫϥεNSObjectΛܧঝ͍ͯ͠ΔΫϥεͰ͋ͬͯɺ@objcͳ͠ͰObjective-C͔Βݺͼग़ͤͳ͍ɻ
@objcΛਪ͠ͳ͘ͳΔͷ2. NSObject༝དྷͷΫϥεextensionͰɺ@objcͳ͠ͰObjective-C͔Βݺͼग़ͤͳ͍ɻ
@objcMembersͷಋೖXCTestͳͲɺΫϥεશମ͕@objcͰ͋Δ͜ͱ͕ٻΊΒΕΔࡍɺ@objcMembersΛ͚ͭΔ
@objcMembersͷಋೖ@objcMembersΛ͚ͭΔΫϥεɺObjecive-CଆͰ swift_objc_membersΛ͚ͭΔ
Extensionʹ͓͚Δ@objcͷON/OFF@nonobjcΛextensionʹ͚ͭΔ͜ͱͰɺ@objcͷର֎ͱ͢Δ͜ͱ͕Ͱ͖Δɻ
Swift 4Ҡߦͷͱ͖Ͳ͏͢Ε͍͍ͷ…ʁ
"Minimal" migrationworkflow
Minimal migration workflow• Step 1:Swift 4ϞʔυͰɺ@objcਪ͞ΕͨՕॴͷͯ͢ͷܯࠂΛղফ͢Δɻ
Minimal migration workflow• Step 2:SWIFT_DEBUG_IMPLICIT_OBJC_ENTRYPOINTΛ1ʙ3ͷؒͷʹઃఆ͠ɺΞϓϦΛςετɻ1.ΤϯτϦϙΠϯτͷݺग़ΛϝοηʔδͰه2.ϩάΛͱΓɺόοΫτϨʔεΛൃߦ3.όοΫτϨʔεͰه͠ɺΫϥογϡ͠·͢ɻ
Minimal migration workflow• Step 3:͜ͷ࣌ͰɺSwift 4ʹҠߦՄೳɻSwift 4ΛϏϧυ͢Δͱɺഇࢭ༧ఆͷϧʔϧʹج͍ͮͯ@objc͕ਪଌ͞ΕͨΓͷέʔεͷObjective-CΤϯτϦϙΠϯτ͕আ͞ΕΔɻ
·ͱΊ• dynamic, NSObject༝དྷͷΫϥεͰ@objcਪ͕͞Εͳ͘ͳΔ• @objcMembersʹΑΓclassશମʹ@objcΛదԠͰ͖ΔΑ͏ʹͳΔ• @nonobjcΛextensionʹదԠ͢Δ͜ͱͰͦͷextension@objcͷదԠ֎ͱ͢Δ͜ͱ͕Ͱ͖Δ
એ
Thank you