#WWDCPAD の発表資料です http://connpass.com/event/6877/
API Design In Swift#WWDCPADFUJI Goro (@__gfx__), a software engineer in COOKPADWWDC2014 reports at COOKPAD, 2014/6/20
View Slide
FUJI Goro (@__gfx__)• Software engineer @ COOKPAD Inc.• Development common libraries for Android / iOS
We are hiring!https://info.cookpad.com/jobs/
Comparison of Swift and Objective-C
Swiftݴޠ༷ͷৄࡉʹ৮Ε·ͤΜ
SwiftͱObjective-Cͷൺֱ• ΞΫηε੍ޚ• ϝιουݺͼग़͠ߏจ• Φʔόʔϩʔυͱ໊લ͖Ҿ• ૯শతϓϩάϥϛϯά
ΞΫηε੍ޚ• Objective-Cެ։ϝιουͷΈϔομϑΝΠϧʹॻ͘• ϑΟʔϧυʹΞΫηε͢Δͷݪଇېࢭ• Swift͕ͯ͢publicͰϑΟʔϧυΞΫηεࣗ༝• ΞΫηείϯτϩʔϧΛ͢Δʹinterfaceͱ࣮ΫϥεΛ͚Δ͜ͱͰରԠͰ͖Δ͕࣮ίετ͕ߴ͍
ϝιουݺͼग़͠ߏจ• Objective-C: [[receiver method1] method2]• Swift: receiver.method1().method2()• ϝιουνΣΠϯ͕Γ͍͢• ࠷ޙͷҾ͕ؔܕͩͱಛघͳߏจ͋Γ• “trailing closures”• receiver.method() { params-> Type in … }
Φʔόʔϩʔυͱ໊લ͖Ҿ• γάωνϟ͕ҧ͑ಉ໊͡લͷϝιουΛෳఆٛͰ͖Δ• ύϥϝλͷܕ͕ҧ͑OK• Ҿͷܕ͕ҧͬͯOK• ໊લ͖ΦϓγϣφϧҾఆٛՄೳ
૯শతϓϩάϥϛϯά• ܕύϥϝʔλΛͱΔΫϥεϝιουΛఆٛͰ͖Δ• δΣωϦΫεͱ͔ςϯϓϨʔτͱ͔͍ΘΕΔͷ• ͨͱ͑ Array ʮҙͷܕTͷྻʯ
ͦͷଞ• Ϋϥεϝιουʢstatic methodʣଘࡏ͠ͳ͍• ൃදͰఆٛͰ͖ͳ͍ͱݴͬͯ͠·͍·͕ͨ͠ɺclass funcͰఆٛͰ͖·͢ʢthanks to @corosuke_kʣ• ԋࢉࢠΦʔόʔϩʔυ͕͋Δ• nilΛσϑΥϧτͰڐ༰͠ͳ͍• nilڐ༰ܕ T? ͱ T!
Swiftʹ͋Δ੍ݶ• ϦϑϨΫγϣϯAPI• ͦΕΒ͖͠API͋ΔͷͰɺਖ਼نϦϦʔε·ͰʹՃ͞ΕΔՄೳੑ͋Γ• performSelectorܥͷಈతϝιουݺͼग़͠• ObjCʹexportͨ͠Ϋϥεʹରͯ͠ͷΈՄೳ
Interoperability of Swift and Objective-C
՝• Objective-CΞϓϦͰSwiftϥΠϒϥϦΛ͑Δ͔ɺ͑Δͱͨ͠ΒͲ͏͍͏͕ඞཁ͔• SwiftΞϓϦͰObjective-CϥΠϒϥϦΛ͑Δ͔ɺ͑Δͱͨ͠ΒͲ͏͍͏͕ඞཁ͔
૬ޓӡ༻ͷݪଇ• Swift͔ΒObjective-Cͷݺͼग़͠: Մೳ• Objective-C͔ΒSwiftͷݺͼग़͠: Մೳ• ͍ͣΕઃఆ͕ඞཁ• ΠϯλʔϑΣΠε100%ޓͰͳ͍
Objective-C from Swift• Objective-C APIΛSwift͔Β͏ͨΊͷϒϦοδXcode͕ࣗಈతʹੜͯ͘͠ΕΔ• Swift͔Βݟ͑ΔCocoa APIͷ΄ͱΜͲͦͷ··͏͜ͱ͕Ͱ͖Δ• String, Array, DictionaryObjCͦͷ··
Blocks• ObjCͷblocksSwiftͷؔܕʹͳΔ• ϝιουؔͷ࠷ޙͷҾ͕blocksͩͱɺtrailing closuresߏจ͕͑Δ• RubyͰಋೖ͞Εͯ͘ΒΕΔΑ͏ʹͳͬͨϒϩοΫϝιουߏจͱ͓ͳ͡
Examplefunc dispatch_async(queue: dispatch_queue_t!, block: dispatch_block_t!)!// trailing closures (ඌΫϩʔδϟʣ!dispatch_async(dispatch_get_main_queue()) {NSLog(“foo”)}!// ௨ৗͷߏจͰ͑Δ!dispatch_async(dispatch_get_main_queue(), {NSLog("foo")})!
Objective-CͷͨΊͷSwift• SwfitͰఆٛͨ͠ΫϥεΛObjective-CͰ͏ͨΊͷϒϦοδXcode͕ࣗಈੜ͢Δ• @objc ΞϊςʔγϣϯΛ͚ͭΔɺ·ͨNSObjectΛܧঝͨ͠Ϋϥε͕ࣗಈతʹObjCଆʹexport͞ΕΔ
ҙ• ϝιουͷΦʔόʔϩʔυԋࢉࢠΦʔόʔϩʔυͳͲɺObjCͰ࣮ݱͰ͖ͳ͍ػೳΤΫεϙʔτͰ͖ͳ͍• ʮObjCରԠSwiftϥΠϒϥϦʯಛผͷରԠ͕ඞཁͰɺͦΕʹΑͬͯSwiftຊདྷͷύϑΥʔϚϯεΛൃشͰ͖ͳ͍Մೳੑ͕͋Δ
API Design
Swift࣌ͷAPIઃܭ• SwiftObjective-CΑΓڧྗ͕ͩɺશ໘తʹSwiftʹҠߦ͢Δʹ·͔͔ͩΔͩΖ͏• ͜Ε͔ΒͷॏཁͳͷɺʮObjective-C͔Β͑ΔSwiftϥΠϒϥϦʯ͓ΑͼʮSwiftͰ͍͍͢Objective-CϥΠϒϥϦʯͩʂ
SwiftϥΠϒϥϦΛॻ͘ݪଇ• public classΛObjCʹexport͢Δ• 3จࣈϓϨϑΟΫεґવͱͯ͠ඞཁͱࢥΘΕΔ• export͢ΔclassͰ੍ݶ͕͋Δ͜ͱʹҙ• ΦʔόʔϩʔυΛ͑ͳ͍• δΣωϦΫεΛ͑ͳ͍
Objective-CΛॻ͘ݪଇ• มߋͦΕ΄Ͳͳ͍• Cocoaࢿ࢈Λͦͷ··͔ͭ͏ͨΊʹ͔ͳΓ͍ͯ͠Δҹ• ෳͷblocksΛड͚औΔͷͰͳ͘ɺ࠷ޙͷҾͰҰ͚ͭͩblocksΛड͚औΔΑ͏ʹ͢Δ• ެ։APIͰͷϦϑϨΫγϣϯආ͚Δ• ͨͱ͑SELΛड͚औͬͯϝιουΛൃߦ͢ΔͷͰͳ͘ɺblocksΛ͏
ҙ• ਖ਼ن൛Ͱطଘͷ੍ݶʹ͍ͭͯมߋ͕͋ΔͱࢥΘΕΔͷͰɺಛʹϦϑϨΫγϣϯϒϦοδ·ΘΓݱࡏͷ༷Λ৴͗͢͡ͳ͍΄͏͕Α͍͔
Show Notes• Welcome Swift• The Swfit Programming Language• Using Swift with Cocoa and Objective-C
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠