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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
160
営業活動なしで継続的に案件を受注する方法 / how to get a contract without sales as a freelance
nerd0geek1
2
970
生体データを取り扱うアプリ開発の勘所
nerd0geek1
1
140
動線改善とステータス可視化で家庭内のストレスを軽減した話
nerd0geek1
3
4.5k
家庭をプロジェクトとして運営した話
nerd0geek1
2
4.3k
fastlaneの勉強会を主催して学んだこと、得たこと、悩んだこと
nerd0geek1
1
1.2k
みんなで育てるprecheck
nerd0geek1
1
810
matchとは?match導入のメリット
nerd0geek1
4
620
Improve your workflow with Sketch plugin
nerd0geek1
3
1.5k
Other Decks in Programming
See All in Programming
PHP 7.4でもOpenTelemetryゼロコード計装がしたい! / PHPerKaigi 2026
arthur1
1
420
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
1.2k
Rethinking API Platform Filters
vinceamstoutz
0
980
Angular-Apps smarter machen mit Gen AI: Lokal und offlinefähig - Hands-on Workshop!
christianliebel
PRO
0
140
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
240
車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体
h1r0
2
420
Codex CLIのSubagentsによる並列API実装 / Parallel API Implementation with Codex CLI Subagents
takatty
2
580
Symfony + NelmioApiDocBundle を使った スキーマ駆動開発 / Schema Driven Development with NelmioApiDocBundle
okashoi
0
240
存在論的プログラミング: 時間と存在を記述する
koriym
5
530
Claude Code Skill入門
mayahoney
0
440
PHPのバージョンアップ時にも役立ったAST(2026年版)
matsuo_atsushi
0
260
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
120
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
240
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
The Curse of the Amulet
leimatthew05
1
11k
Tell your own story through comics
letsgokoyo
1
870
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
440
Chasing Engaging Ingredients in Design
codingconduct
0
150
Navigating Team Friction
lara
192
16k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
290
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
150
Darren the Foodie - Storyboard
khoart
PRO
3
3k
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)