Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
580
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
570
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
410
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
790
How did I build an Open-Source SwiftUI Toast Library
lovee
1
190
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
460
Other Decks in Programming
See All in Programming
npm との違いを手がかりにGo の依存管理を理解したい
optim
0
800
Railsのためのパスキー実践入門 〜マルチテナントSaaSでの意思決定〜
utakaha
3
670
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
Jetpack Compose Mechanisms
skydoves
3
820
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Featured
See All Featured
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
My Coaching Mixtape
mlcsv
0
360
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
940
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
410
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
550
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
580
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
400
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
460
Balancing Empowerment & Direction
lara
6
1.3k
sira's awesome portfolio website redesign presentation
elsirapls
0
460
A designer walks into a library…
pauljervisheath
211
25k
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ྑ͍Ͱ͕͢ɺެࣜυΩϡϝϯτͪΌΜͱಡΈ·͠ΐ͏ɻ ▸ લͷ͕ࣗॻ͍ͨίʔυ͕ΫιͩͱࢥΘͳ͔ͬͨΒ͕ࢭ·ͬͨূڌʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ