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 4.0 対応しようとしたら大変な目に遭った話
Search
Elvis Shi
September 16, 2017
Programming
2.5k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Swift 4.0 対応しようとしたら大変な目に遭った話
Swift 4対応するときのエモい話
Elvis Shi
September 16, 2017
More Decks by Elvis Shi
See All by Elvis Shi
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
480
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
510
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
150
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
390
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
760
How did I build an Open-Source SwiftUI Toast Library
lovee
1
180
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
1.3k
SwiftUIで二重スクロール作ってみた / When I tried to make a dual-scroll-ish view in SwiftUI
lovee
1
390
Observation のあれこれ / A brief introduction about Observation
lovee
3
450
Other Decks in Programming
See All in Programming
仕様駆動開発の消費期限
watany
7
3.6k
5分で問診!Composer セキュリティ健康診断
codmoninc
0
860
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.8k
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
360
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
970
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
240
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
140
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.4k
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
210
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
How to Talk to Developers About Accessibility
jct
2
480
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
330
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.7k
Accessibility Awareness
sabderemane
1
170
Into the Great Unknown - MozCon
thekraken
41
2.7k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
360
Context Engineering - Making Every Token Count
addyosmani
9
1k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
360
The agentic SEO stack - context over prompts
schlessera
0
860
Transcript
4XJGUରԠ͠Α͏ͱͨ͠Β େมͳʹૺͬͨ for iOSDC Japan 2017
ΤϞ͍ ࠓ ˞4XJGUͷݴޠ༷ͷ͋Γ·ͤΜɻ
override init() { super.init() emplyedBy = "MAGES. 5pb. Game div"
job = "iOS Developer" twitter = "@lovee" qiita = "@lovee" github = "el-hoshino" additionalInfo = "དྷ݄స৬͠·͢ʘ(^o^)ʗ" class Speaker: Developer { } }
4XJGUରԠɺ ͍ͯ͠·͔͢ʁ
ࢲ88%$ޙ͔Β ͍ͯ͠·͢ʂ
ˠ ˠ ˠ ☠
ௐࢠʹͬͯ ͠·ͬͨ
ຊͷ ओ
1MPU 3FWJFX "QQMJDBUJPO 7JB %BUBJOQVU "TTJTUBOU
13"7%" "%7ήʔϜγφϦΦ ϨϏϡʔΞϓϦ༻ ϑϨʔϜϫʔΫ
13"7%" νϟϓλʔϑϩʔͰ ಡΈ͍ͨষΛબͿ
13"7%" ͦͷষͷ࠷ॳͷ γφϦΦϑΝΠϧΛ ಡΉ
13"7%" ηϦϑʹධՁΛ ͚ͭΔ
13"7%" ͜ͷϑΝΠϧࣗମٴͼ ͜ͷϑΝΠϧʹ ొͨ͠ΩϟϥΛධՁ
13"7%" ࣍ͷϑΝΠϧ ਐΉ
13"7%" ষͰ͜ͷষͷ ײΛ͢
13"7%" ৽͍͠νϟϓλʔ͕ ղআ͞Εɺ νϟϓλʔϑϩʔ
13"7%" UITableView UIPageView UISlider UIPanGestureRecognizer FUDʜ
13"7%"։ൃ࣌αϚϦʔ ▸ ։ൃ։࢝࣌ɿ4XJGUظ ▸ ࣌ґଘڥɿࣗ࡞ϑϨʔϜϫʔΫ&MUBTP ݩڟͦͷҰ ݩڟͦͷೋ
13"7%"։ൃॳͷεΩϧະख़ͩͬͨ ▸ J04։ൃʹͦͦ͜͜׳Ε͖ͯ࢝Ίͨࠒ ▸ ઃܭʹؾΛΓ࢝Ί͕ͨܦݧઙ͔ͬͨͨΊ·͔ͩͬͨ ▸ σʔλϑϩʔ͕ෳࡶͰಈ࡞Λ͍ʹ͔ͬͨ͘ ▸ ʮڞ௨ͷઃఆ͔ͩΒΈΜͳ͏ʯͱ͍͏୯७ͳཧ༝Ͱ4JOHMFUPOΛ͍ ͕ͬͨ
▸ ͱΓ͋͑ͣ4XJGUʹ্͛ͯΈͨΒ΄ͱΜͲमਖ਼͍Βͣ ▸ ͔͔ͤͬͩ͘ΒؾʹͳͬͨϙΠϯτͦ͏ͱࢥͬͨ ▸ ্هͷઃܭͷ͞Ͱେ෯ͳॻ͖͑Λڧ͍ΒΕͨ
13"7%"։ൃ࣌αϚϦʔ ▸ ։ൃ։࢝࣌ɿ4XJGUظ ▸ ࣌ґଘڥɿࣗ࡞ϑϨʔϜϫʔΫ&MUBTP ݩڟͦͷҰ ݩڟͦͷೋ
&MUBTPͱԿ͔ ▸ 4XJGUʹ͋Γͦ͏Ͱͳ͔ͬͨ৭ΜͳศརͳػೳΛΓࠐΜͩ൚༻ϑϨʔϜϫʔΫ ▸ CGPointಉ࢜ͳͲͷ͠ࢉҾ͖ࢉ ▸ ܾ·ͬͨൣғͷཚੜInt.makeRandom(within: 0 ..< 10)
▸ ྻͷγϟοϑϧ[1, 2, 3, 4, 5].shuffled ▸ ͳͲͳͲʜ ▸ ࠷ॳϋοΧιϯͷ࣌ͷίʔσΟϯάޮͷͨΊʹ࡞ͬͨ ▸ ࡞ͬͯΔ͏ͪʹʮ࣮ʹศར͡ΌͶʯͱࢥ͍ͬͯ࢝Ίͨ IUUQTHJUIVCDPNFMIPTIJOP&MUBTP
&MUBTPͷԿ͕มΘ͔ͬͨ ▸ ͿͬͪΌ͚࡞ͬͨॳԿਂ͘ߟ͑ͣʹػೳΓࠐΜͰͨ ▸ 4XJGUˠͷ࣌ͷίʔυमਖ਼͚ͩͰେมͩͬͨͷͰͦΕʹઐ೦ͨ͠ ▸ 4XJGUˠͷࠓίʔυमਖ਼΄΅ͳ͔ͬͨͷͰʮ༨ܭʯͳ͜ͱߟ͑࢝Ίͨ ▸ ͜ͷ"1*ઃܭຊʹެࣜΨΠυϥΠϯʹଇͬͯΔ͔Ͳ͏͔ ▸
͜Εຊʹ&MUBTPʹೖΕΔ͖ػೳ͔ʢಠཱͤ͞Δ͖͔ʣ ▸ 5BSHFUFE&YUFOTJPOTͷಋೖʢxxx.rx.doSth()Έ͍ͨͳॻ͖ํʣ ▸ ͍ํ͕ΨϥϦͱมΘͬͯ&MUBTPґଘͷϓϩδΣΫτ͕େมͳ͜ͱʹ IUUQTHJUIVCDPNFMIPTIJOP&MUBTP
/PU"VUP-BZPVUΛ৽ͨʹಋೖͨ͠ ▸ ॳશͯͷϨΠΞτίʔυϕʔεͩͬͨ ▸ ϨΠΞτશͯlayoutSubviews()ͷoverrideͰରԠͨ͠ ▸ ೝ͕ࣝΓͣɺlayoutSubviews()Λݺͼग़͢Օॴ͋ͬͨ ▸ ࢠϏϡʔΛϓϩύςΟʔͱͯ͠อ࣋͢Δඞཁ͕͋ͬͨ ▸
ผͷϓϩδΣΫτͷ੍࡞࣌ʹ/PU"VUP-BZPVUΛ࡞ͬͨ ▸ layoutSubviews()Λඞͣ͠override͢Δඞཁ͕ͳ͘ͳͬͨ ▸ ࢠϏϡʔͷϨΠΞτΛϏϡʔͷϓϩύςΟʔͱͯ͠อ࣋Ͱ͖ΔͨΊ ࢠϏϡʔࣗମΛϓϩύςΟʔͱͯ͠อ࣋͢Δඞཁ͕ͳ͘ͳͬͨ ▸ ʲએʳචऀݱࡏͷϝΠϯ044ϓϩδΣΫτʂ IUUQTHJUIVCDPNFMIPTIJOP/PU"VUP-BZPVU
݁Ռɿ ຆͲॻ͖͑ʹ
FlowContentControllerʢچʣ fileprivate lazy var chapterButtons: [FlowChapterButton] = { let chapters
= GlobalSettings.shared.chapterMetas let buttons = chapters.enumerated().map { (i, chapterMeta) -> FlowChapterButton in let button = FlowChapterButton(meta: chapterMeta) button.setOnTappedAction({ [weak self] _ in self?.didSelectChapter(i) }) return button } return buttons }()
FlowContentControllerʢ৽ʣ private lazy var chapterButtons: [FlowChapterButton] = { let chapters
= self.model.getChapters(for: self) let buttons = chapters.map { (chapter) -> FlowChapterButton in let button = self.makeButton(for: chapter) return button } return buttons }()
FlowControllerʢچʣ override func viewDidLoad() { super.viewDidLoad() // Do any additional
setup after loading the view. do { let controller = self.flowContentController controller.delegate = self controller.dataSource = self.dataSource self.addChildViewController(controller) self.flowView.contentView = controller.view controller.didMove(toParentViewController: self) } do { let controller = self.pageHeaderController controller.setHeaderTitleString("νϟϓλʔબ") self.addChildViewController(controller) self.flowView.header = controller.view controller.didMove(toParentViewController: self) } }
FlowControllerʢ৽ʣ override func viewDidLoad() { super.viewDidLoad() self.setupContentController() self.setupHeaderController() }
ScenarioModelʢ৽چࠩʣ
➡ େมͩͬͨ ͚Ͳ ಡΈ͢͞ େ෯ʹ㽉
ͱࢥͬͨΒࠓ J1IPOF9ͷొͩ
None
ͰؤுͬͯͰ /PU"VUP-BZPVUΛ TBGF"SFB*OTFUTʹ ରԠͤͨ͞
None
چ ৽
ʲએʳ /PU"VUP-BZPVU ධެ։தʂ IUUQTHJUIVCDPNFMIPTIJOP/PU"VUP-BZPVU
ڭ܇ͦͷҰ ▸ 4JOHMFUPO͖ͪΜͱ͏͖͔Λߟ͔͑ͯΒ͑ ▸ ʮΠϯελϯε͕Ұݸ͔͠ͳ͍ʯ4JOHMFUPOΛ͏ཧ༝ʹͳΒͳ͍ ▸ ʮΈΜͳڞ௨ͯ͠͏ʯ4JOHMFUPOΛ͏ཧ༝ʹͳΒͳ͍ ▸ ʮ୭͍ͭ͜ʹΛ࣋ͯΔʹΓਚ͘͢͜ͱ͕ڐ͞ΕΔʯͷ͚ͩ 4JOHMFUPOΛ͍͍ͬͯ
ڭ܇ͦͷೋ ▸ ઃܭ͖ͪΜͱอक͢Δ࣌ͷࣗΛߟ͑ͯઃܭ͠Ζ ▸ ѱ͍ઃܭॻ͘ͱ͖ศར͔͠Εͳ͍͕อक࣌ʹࢮ͵ ▸ อक࣌ʹͦͷѱ͍ઃܭΛʹ͢ΔͱͦΕΛॻ͍ͨࣗΛͿΜԥΓͨ͘ͳΔ ▸ Ͱ·͔͋ͱݴͬͯͿͬͪΌ͚ͦΕࣗͷεΩϧʹґଘ͢Δͷ͔ͩΒ ࠓ͖ͪΜͱͨͭ͠ΓͰଟޙͷอक࣌ʹྺ࢙܁Γฦ͢
▸ ͦΕͰͦΕεΩϧΞοϓͷূڌ͔ͩΒڪΕͣʹ͠·͠ΐ͏
ڭ܇ͦͷࡾ ▸ 'SBNFXPSLͷଟ༻ґଘੑ͕େมͳ͜ͱʹͳΔ ▸ ͍࢝Ίͨͱ͖͔֬ʹศར͚ͩͲґଘ͢Δ'SBNFXPSL͕૿͑Δͱ ͦͷ͚ͩґଘؔ૿͑Δ ▸ 'SBNFXPSLʹมߋ͕͋ΔͱͬͯΔϓϩδΣΫτͷमਖ਼༨ّͳ͘͞ΕΔ ▸ 'SBNFXPSLΛࣗ࡞͢ΔͱϓϩάϥϜઃܭʹ͍ͭͯΑΓਂ͘ߟ͑ͤͯ͘͞ΕΔ
▸ 'SBNFXPSLͦΕΛར༻͢ΔશͯͷϓϩδΣΫτʹӨڹΛٴ΅͢ͷͰ "1*ͷઃܭʹͱͯؾΛ͚ͭΔඞཁ͕͋Δ
ॳ৺ऀͷΞυόΠε ▸ ͱʹ͔͕͘Ή͠ΌΒʹ͍ͬͺ͍ॻ͖·͠ΐ͏ɻ ▸ Կߟ͑ͣʹॻ͘ͷͰͳ͘ɺྫ͑)PX͕ཧղͰ͖ͳͯ͘ɺ8IBUͱ8IZ Λཧղ͢ΔྗΛ͠·͠ΐ͏ɻ ▸ Γ͍ͨ͜ͱ͕Ͱ͖͔ͨΒͬͯࢥߟఀࢭͤͣɺΑΓྑ͍ॻ͖ํ͕ͳ͍͔ߟ͑· ͠ΐ͏ɻ ▸
͍ͬͺ͍นʹͿ͔ͭͬͯઃܭʹ͍ͭͯͷཧղΛਂΊ·͠ΐ͏ɻ ▸ 2JJUB5FSB5BJMྑ͍Ͱ͕͢ɺެࣜυΩϡϝϯτͪΌΜͱಡΈ·͠ΐ͏ɻ ▸ લͷ͕ࣗॻ͍ͨίʔυ͕ΫιͩͱࢥΘͳ͔ͬͨΒ͕ࢭ·ͬͨূڌʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ