Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
進化を続けるSwift-iOSに追随し続けるために
Search
Kohei Tabata
August 29, 2016
Programming
1
2.6k
進化を続けるSwift-iOSに追随し続けるために
Kohei Tabata
August 29, 2016
Tweet
Share
More Decks by Kohei Tabata
See All by Kohei Tabata
AIと協業する開発の進め方
nerd0geek1
0
130
営業活動なしで継続的に案件を受注する方法 / how to get a contract without sales as a freelance
nerd0geek1
2
940
生体データを取り扱うアプリ開発の勘所
nerd0geek1
1
110
動線改善とステータス可視化で家庭内のストレスを軽減した話
nerd0geek1
3
4.3k
家庭をプロジェクトとして運営した話
nerd0geek1
2
4.3k
fastlaneの勉強会を主催して学んだこと、得たこと、悩んだこと
nerd0geek1
1
1.1k
みんなで育てるprecheck
nerd0geek1
1
760
matchとは?match導入のメリット
nerd0geek1
4
590
Improve your workflow with Sketch plugin
nerd0geek1
3
1.4k
Other Decks in Programming
See All in Programming
ProxyによるWindow間RPC機構の構築
syumai
1
320
testingを眺める
matumoto
1
130
250830 IaCの選定~AWS SAMのLambdaをECSに乗り換えたときの備忘録~
east_takumi
0
360
AI時代のドメイン駆動設計-DDD実践におけるAI活用のあり方 / ddd-in-ai-era
minodriven
25
9.6k
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
1
590
さようなら Date。 ようこそTemporal! 3年間先行利用して得られた知見の共有
8beeeaaat
0
140
AIコーディングAgentとの向き合い方
eycjur
0
250
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
120
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
360
MLH State of the League: 2026 Season
theycallmeswift
0
210
速いWebフレームワークを作る
yusukebe
3
1.5k
Swift Updates - Learn Languages 2025
koher
0
140
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
126
53k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
4 Signs Your Business is Dying
shpigford
184
22k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Designing Experiences People Love
moore
142
24k
Music & Morning Musume
bryan
46
6.8k
Embracing the Ebb and Flow
colly
87
4.8k
Art, The Web, and Tiny UX
lynnandtonic
302
21k
Navigating Team Friction
lara
189
15k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
Transcript
ਐԽΛଓ͚ΔSwift/iOSʹ ਵ͠ଓ͚ΔͨΊʹ 2016/08/29 AKIBA.swift×SwiftѪձ @ώΧϦΤ
ࣗݾհ ɾKohei Tabata(@nerd0geek1) ɾSaib Studio LLC ɾiOS/MacOS/tvOS Developer ɾFastlaneେ͖ ɾ࠷ۙɺϥΠϒϥϦ࡞ΓʹϋϚ͍ͬͯ·͢ɻ
Said Studio LLC Kohei Tabata Next! Remote quick-zip plus Sleeple
http://next.saib-stud.io
ͦΖͦΖळͰ͢Ͷɻ
ळͱ͍͑
ಡॻͷळ
৯ཉͷळ
ӡಈͷळ
৽OSͷळ
͔͠ࠓ
OS/Swift͕ ಉ࣌Ξοϓσʔτʂ
Կ४උΛ ͍ͯ͠ͳ͍ͱ
None
ͲͷΑ͏ʹiOS/Swiftͷ ਐԽʹै͢Δ͔
ࣗͷऔΓΈ ɾίΞػೳҎ֎ͷίʔυͷϞδϡʔϧԽ ɾςετʹΑΔૉૣ͍มߋݕ ɾprotocolΛར༻࣮ͨ͠ͷநԽ ɾΦϒδΣΫτίϯϙδγϣϯ ɹprotocol extensionΛར༻ͨ͠ෳࡶ͞ͷݮ
ίʔυͷϞδϡʔϧԽ ɾ΄ͱΜͲͷϓϩδΣΫτͰɺ࣮͢Δ͜ͱ͍͍ͩͨҰॹɻ ɾ൚༻తͳ෦ʹ͍ͭͯɺϥΠϒϥϦԽ͠ɺϞδϡʔϧͱͯ͠ ɹ͓͘͜ͱͰɺશϓϩδΣΫτʹ͓͍ͯDRYʹॻ͚Δɻ ɹʹOSɺSwiftͷมߋʹରͯ͠࠷খͷमਖ਼ͰରԠͰ͖Δɻ ɾIFఆٛˠ࣮ɾςετͷՃͷॱͰ࣮͢ΔͷͰɺૄ݁߹Ͱ ɹςελϒϧͳίʔυΛॻ͖͍͢ɻ
͜Μͳײ͡ Next! Remote quick-zip plus Next! for Mac TableView Manager
PlayList Player Swift Extensions Logger Pausable Timer
ςετʹΑΔૉૣ͍มߋݕ ɾApple༷ɺ͠ΕͬͱഁյతมߋΛೖΕΔ͜ͱ͕͋Δɻ ɹSwift1.2→Swift2.0ͷStringͷpathૢ࡞ܥϝιουͷഇࢭ ɹSwift2.0→Swift3.0ͷFoundationͷΫϥεˠߏମͷมߋͳͲɻ ɾςετΛՃ͢Δ͜ͱͰɺͦ͏͍ͬͨมߋʹΑΔڍಈͷมԽΛ ɹૉૣ͘ݕͰ͖ΔΑ͏ʹͳΔɻ ɹ
protocolΛར༻࣮ͨ͠ͷநԽ ྫɿ͋ΔViewɺ͋ΔViewModel͕NSUserDefaults ɹɹαʔυύʔςΟͷϥΠϒϥϦͷࢀরΛอ͍࣋ͯ͠Δ߹ ɹˠϞδϡʔϧ͕֎෦ʹґଘ͢ΔͨΊɺςετͰ͖ͳ͍ɻ ɹɹςετͰ͖ͨͱ͔ͯͬͨ͠Γɺޙ͕࢝େมɻɻɻ ViewModel A NSUserDefaults ViewModel B
Dropbox SDK
protocolΛར༻࣮ͨ͠ͷநԽ ྫɿ͋ΔViewɺ͋ΔViewModel͕NSUserDefaults ɹɹαʔυύʔςΟͷϥΠϒϥϦͷࢀরΛอ͍࣋ͯ͠Δ߹ ɹˠϞδϡʔϧ͕֎෦ʹґଘ͢ΔͨΊɺςετͰ͖ͳ͍ɻ ɹɹςετͰ͖ͨͱ͔ͯͬͨ͠Γɺޙ͕࢝େมɻɻɻ
protocolΛར༻࣮ͨ͠ͷநԽ ɾඞཁͳػೳΛ࣋ͭprotocolΛఆٛ(͜͜ͰLocalConfigType)ɻ ɾViewModel͔ΒprotocolΛࢀরɻ ɾ࣮ͰɺNSUserDefaultsΛ෦Ͱࢀর͢ΔLocalConfigΛ͢ ɾςετͰɺLocalConfigMockͰϞοΩϯά͢Δɻ ViewModel A var config: LocalConfigType
protocol LocalConfigType NSUserDefaults LocalConfig: LocalConfigType LocalConfigMock: LocalConfigType var dictionary: [String: AnyObject] ϓϩμΫγϣϯίʔυ ςετ
protocolΛར༻࣮ͨ͠ͷநԽ ɾprotocolΛར༻࣮ͨ͠ͷநԽɺґଘੑͷೖʹ͍ͭͯ ɹલهͷΑ͏ʹ࣮Ͱ͖Δ͕ɺSwiftͷframeworkଘࡏ͍ͯ͠Δɻ
protocolΛར༻࣮ͨ͠ͷநԽ ɾprotocolΛར༻࣮ͨ͠ͷநԽɺґଘੑͷೖʹ͍ͭͯ ɹલهͷΑ͏ʹ࣮Ͱ͖Δ͕ɺSwiftͷframeworkଘࡏ͍ͯ͠Δɻ ɾSwinjectɿେنϓϩδΣΫτͰͷཧʹ͍͍ͯΔͱͷ͜ͱɻ
ΦϒδΣΫτίϯϙδγϣϯͱ protocol extensionͰෳࡶ͞Λݮ
࣮ࡍͷϓϩμΫτΛྫʹ ϑΝΠϧҰཡը໘ Ϋϥυ্ͷ ϑΝΠϧҰཡը໘ ΫϥυΞοϓϩʔυ͢Δ ϑΝΠϧͷબը໘ ϑΝΠϧҠಈը໘
நԽ͢Δͱ A D C B
ѱ͍ઃܭ جఈΫϥε(ViewController) - ڞ௨ίϯϙʔωϯτͷ࡞ - ڞ௨ॲཧͷ࣮ߦ αϒΫϥε - ಠࣗίϯϙʔωϯτͷ࡞ -
ίϯϙʔωϯτͷϨΠΞτ - ಠࣗॲཧͷ࣮ߦ
ѱ͍ઃܭ͕ͳͥѱ͔͔ͬͨ ɾαϒΫϥεΛฤू͢ΔࡍʹɺجఈΫϥεͷ࣮Λؾʹ͢Δඞཁ͕ ɹ͋Δɻ ɾશମͱͯ͠ີ݁߹ʹͳ͍ͬͯΔͨΊɺΞʔΩςΫνϟͷมߋ͕ ɹ͔ͳΓΓʹ͍͘ɻ ɾجఈΫϥε͕ԿͰ͔ΜͰ͍ͬͯΔঢ়ଶʹͳͬͯ͠·ͬͯ ɹ͍ͨ(Ұ෦ͷαϒΫϥεͰ͔͠Θͳ͍ॲཧ͋ͬͨΓɻɻɻ)
ܧঝ͔Βίϯϙδγϣϯ ɾΫϥεΛআ ɾUIͷڞ௨෦ΛΧελϜViewΫϥεͱͯ͠Γग़͢ ɾجఈΫϥεͷॲཧɺҰ୴ɺ֤ViewController
Կ͕ྑ͘ͳ͔ͬͨʁ ɾίʔυશମͷݟ௨͕͠Α͘ͳͬͨɻ ɾGenericʹؔ࿈ͨ͠ॲཧΛॻ͖͘͢ͳͬͨɻ ɾमਖ਼ͷࡍʹݟΔ͖είʔϓ͕ڱ·ͬͨɻ ɾҰ࿈ͷViewControllerͷ݁߹͕Լ͕ͬͨ ɹ(ࢠ͕ؔͳ͘ͳͬͨͨΊ)ɻ ɾͨͩ͠ɺશମͱͯ͠ͷίʔυྔ͔ͳΓ૿͑ͨɻɻɻ
ͲΜͳίʔυ͕૿͔͑ͨ ɾಉ͡ػೳ͕ͩશͯͷΫϥεͰར༻͠ͳ͍ίʔυɻ ɹෳͷΫϥε͕ڠௐͯ͠1ͭͷػೳͱͳΔΑ͏ͳίʔυɻ ྫɿRepositoryͷૢ࡞Λߦ͍ɺͦͷ݁Ռͱͯ͠ViewΛߋ৽͢Δ ɾUIViewController͔ΒݺΕΔ͜ͱ͕લఏͱͳ͍ͬͯΔίʔυ ɹ(UIAlertControllerͳͲɻΧελϜViewʹدͤΔ͜ͱ͕Ͱ͖ͳ͍) ɾViewControllerͷͰ͋Δ͖ίʔυɻ ɹ(ViewɺModelɺViewModelͷશͯͱؔ͢Δ)
protocol extensionͷద༻ ɾෳͷViewControllerؒͰͷڞ௨ॲཧͷIFΛprotocolͱͯ͠ఆٛ ྫɿRepositoryΛૢ࡞͠ɺViewʹө͢Δϝιου ɹɹRepositoryͷΠϯελϯε(computed property) ɹɹViewͷΠϯελϯε(computed property) ɾprotocol extensionͰڞ௨ͷৼΔ͍Λ࣮
protocol extensionͷద༻ ɾ֤ViewControllerʹprotocolΛద༻ɻ ɹcomputed propertyʹɺ֤ViewControllerͷΠϯελϯεΛ ɹ͢ →࣮͔Βͯ͠ৼΔ͍Λڞ௨ԽͰ͖ͨʂ
·ͱΊ - ϥΠϒϥϦԽͯ͠ίʔυͷ࠶ར༻ੑΛߴΊͯ - ςετέʔεͷՃʹΑΓɺมߋڧͯ͘͠ - DIͳͲͰ݁߹Λ͘͠ɺ - దͳσβΠϯύλʔϯΛબͯ͠ϓϩδΣΫτͷෳࡶ͞Λݮ ͢Δ͜ͱͰSwift/iOSͷਐԽʹै͘͢͠ͳΔ͔ɻɻɻʁ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ
ࢀߟ ɾSwinject/Swinject ɹ(https://github.com/Swinject/Swinject)