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
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
490
ゼロから始める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
750
How did I build an Open-Source SwiftUI Toast Library
lovee
1
170
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
380
Observation のあれこれ / A brief introduction about Observation
lovee
3
440
ChatGPT 時代の勉強 / Learning under ChatGPT era
lovee
27
9k
Other Decks in Programming
See All in Programming
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
580
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.4k
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
510
AIエージェントで 変わるAndroid開発環境
takahirom
2
490
act2-costs.pdf
sumedhbala
0
110
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
250
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
310
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
840
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
840
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.3k
Featured
See All Featured
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
490
Being A Developer After 40
akosma
91
590k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
310
sira's awesome portfolio website redesign presentation
elsirapls
0
300
Embracing the Ebb and Flow
colly
88
5.1k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
How GitHub (no longer) Works
holman
316
150k
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ྑ͍Ͱ͕͢ɺެࣜυΩϡϝϯτͪΌΜͱಡΈ·͠ΐ͏ɻ ▸ લͷ͕ࣗॻ͍ͨίʔυ͕ΫιͩͱࢥΘͳ͔ͬͨΒ͕ࢭ·ͬͨূڌʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ