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
550
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
550
ゼロから始めるPreferenceの実装 / Let's implement Preferences from scratch
lovee
0
160
Kotlin エンジニアへ送る:Swift 案件に参加させられる日に備えて~似てるけど色々違う Swift の仕様 / from Kotlin to Swift
lovee
1
400
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
780
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
450
Other Decks in Programming
See All in Programming
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
2.9k
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
120
Intent as Code
shoppingjaws
6
1.1k
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
220
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
430
Security issues being discussed on Web Platforms
petamoriken
0
1.1k
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
140
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
340
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
130
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
320
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
140
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
Featured
See All Featured
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Ethics towards AI in product and experience design
skipperchong
2
380
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
HDC tutorial
michielstock
2
880
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Paper Plane
katiecoart
PRO
4
53k
RailsConf 2023
tenderlove
30
1.6k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
700
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
540
A Soul's Torment
seathinner
8
3.6k
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ྑ͍Ͱ͕͢ɺެࣜυΩϡϝϯτͪΌΜͱಡΈ·͠ΐ͏ɻ ▸ લͷ͕ࣗॻ͍ͨίʔυ͕ΫιͩͱࢥΘͳ͔ͬͨΒ͕ࢭ·ͬͨূڌʂ
͋Γ͕ͱ͏ ͍͟͝·ͨ͠ʂ