Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
既存アプリへのSwiftUI導入事例
Takashico
July 05, 2021
Programming
0
410
既存アプリへのSwiftUI導入事例
Takashico
July 05, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
Isar勉強会
hoddy3190
0
500
クラウド KMS の活用 / TOKYO BLOCKCHAIN TECH MEETUP 2022
odanado
PRO
0
190
Amazon Lookout for Visionで 筆跡鑑定してみた
cmnakamurashogo
0
170
Pluggable Storage in PostgreSQL
sira
1
190
테라폼으로 ECR 관리하기 (How to Manage ECR with Terraform)
posquit0
0
530
Getting Started With Data Structures
adoranwodo
1
260
VIMRC 2022
achimnol
0
140
SRE NEXT 2022に学ぶこれからのSREキャリア
fukubaka0825
2
390
フロントエンドエンジニアが変える現場のモデリング意識/modeling-awareness-changed-by-front-end-engineers
uggds
32
13k
Untangling Coroutine Testing (Droidcon Berlin 2022)
zsmb
2
490
Records の使い方はこれでいいの? をみんなで考えたい / Java DO #20
gishi_yama
0
120
読みやすいコード クラスメソッド 2022 年度新卒研修
januswel
0
2.9k
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
35
6.9k
How To Stay Up To Date on Web Technology
chriscoyier
780
250k
Building a Scalable Design System with Sketch
lauravandoore
448
30k
What's in a price? How to price your products and services
michaelherold
229
9.4k
Designing the Hi-DPI Web
ddemaree
272
32k
The Pragmatic Product Professional
lauravandoore
19
3.1k
A Philosophy of Restraint
colly
192
15k
Documentation Writing (for coders)
carmenintech
48
2.6k
Facilitating Awesome Meetings
lara
29
4.1k
Why You Should Never Use an ORM
jnunemaker
PRO
47
7.7k
How STYLIGHT went responsive
nonsquared
85
4k
Teambox: Starting and Learning
jrom
123
7.7k
Transcript
طଘΞϓϦͷSwiftUIಋೖࣄྫ 2021/6/30 Shiko Takahashi
2 ࣗݾհ • Shiko Takahashi • iOSΞϓϦΤϯδχΞ • Android͡Ί·ͨ͠ʂ •
ٳΈͷɺೣͱ༡Ϳ ɻ @takashico @takashico smtakahashi
3 ຊ͓͢͠Δ͜ͱ
4 ຊ͓͢͠Δ͜ͱ • SwiftUIͱ • ಋೖͷ͖͔͚ͬ • ಋೖલͷݕ౼ʹ͍ͭͯ • ·ͱΊ
5 SwiftUIͱ
6 SwiftUIͱ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮUPʣ
◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui
7 SwiftUIͱ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮUPʣ
◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui ͜ͷ੍ʹΑͬͯಋೖ͕͔ͬͨ͠
8 SwiftUIͱ • ৽͍͠UIϑϨʔϜϫʔΫʢWWDC19ʣ ◦ গͳ͍ίʔυͰUIߏங͕Մೳ ◦ એݴܕγϯλοΫεʢγϯϓϧʣ ◦ ϓϨϏϡʔػೳʢσόοάޮUPʣ
◦ etc… • αϙʔτΛiOS13.0Ҏ্ʹ͢Δඞཁ͕͋Δ SwiftUI ΑΓ༏ΕͨAppΛɺΑΓগͳ͍ίʔυͰɻ ࢀর: https://developer.apple.com/jp/xcode/swiftui ͜ͷ੍ʹΑͬͯಋೖ͕͔ͬͨ͠ εϖʔεϚʔέοτΞϓϦʹ ͍͔ͭಋೖ͍ͨ͠ͳͱߟ͍͑ͯ·ͨ͠🤔 ʢಋೖલ·ͰiOS11.4·Ͱαϙʔτͯ͠ ͍·ͨ͠ʣ
9 ಋೖͷ͖͔͚ͬ
10 ಋೖͷ͖͔͚ͬ ϗʔϜը໘ͷUIϦχϡʔΞϧΛߦ͏͜ͱʹɻ
11 ಋೖͷ͖͔͚ͬ ৽͍͠ϗʔϜը໘
12 ಋೖͷ͖͔͚ͬ ৽͍͠ϗʔϜը໘ ͔̍Β࡞Γ͢ඞཁ͕͋ΔͷͰɺ ͜ͷػձʹSwiftUIͰͬͯΈ͍ͨ😃 ͍͟ݕ౼ͯ͠ΈΑ͏ʂ
13 ಋೖલͷݕ౼
14 SwiftUIಋೖલͷݕ౼ 1. αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ 3. ϝϦοτ͕͋Δ͔ʁ
15 1. αϙʔτΛiOS13.0Ҏ্ʹ͢Δ͜ͱ͕Ͱ͖Δ͔ʁ
16 αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ • શମʢ৽نϢʔβʔʣ ◦ iOSόʔδϣϯผͷར༻ঢ়گΛ֬ೝ ◦ iOSͷΞοϓσʔτ༧ఆ • εϖʔεϚʔέοτʢطଘϢʔβʔʣ
◦ iOSόʔδϣϯผͷར༻ঢ়گΛ֬ೝ ͦΕͧΕiOS13.0Ҏ্ʹ͋͛ͯͳ͍ͷ͔Λ֬ೝ͍͖ͯ͠·͢
17 શମతͳiOSόʔδϣϯ༻ͱঢ়گ
18 աڈ4ؒʹಋೖ͞ΕͨσόΠεͷiOSόʔδϣϯ༻ 90% 8% 2% ࢀর: https://developer.apple.com/jp/support/app-store ※ 20216݄3࣌
19 աڈ4ؒʹಋೖ͞ΕͨσόΠεͷiOSόʔδϣϯ༻ 90% 8% 2% ࢀর: https://developer.apple.com/jp/support/app-store ※ 20216݄3࣌ 98%ͷσόΠεͰ
iOS13Ҏ্͕ਁಁ ͍ͯ͠Δ
20 ࠓळࠒʹiOS15͕ϦϦʔε༧ఆ ࢀর: https://www.apple.com/apple-events/june-2021
21 ࠓळࠒʹiOS15͕ϦϦʔε༧ఆ ࢀর: https://www.apple.com/apple-events/june-2021 ϦϦʔεޙɺ iOS13ະຬͷ༻ ͕ݮগ͍ͯ͘͠ ͜ͱ͕ݟࠐΊΔ
22 શମతͳiOSόʔδϣϯผ༻ͱঢ়گ iOS13Ҏ্98%ਁಁ͍ͯ͠Δ + ࠓळʹiOS15͕ϦϦʔε༧ఆ SwiftUIΛಋೖͰ͖Δڥ͕͖͍ͬͯͯΔ
23 εϖʔεϚʔέοτΞϓϦͷ iOSόʔδϣϯผར༻ঢ়گΛ֬ೝ
24 εϖʔεϚʔέοτΞϓϦͷiOSผར༻ঢ়گͷ֬ೝ ڐ༰ൣғͰ͋Δ͜ͱΛ֬ೝ App Store ConnectͰiOSόʔδϣϯผͷར༻ঢ়گΛ֬ೝͰ͖·͢ iOS12ҎԼͷར༻ શମͷ0.3%΄ ͲͰͨ͠ɻ
25 αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ • શମ ◦ 98%ͷσόΠεͰiOS13Ҏ্Λ༻͍ͯ͠Δʢաڈ4ؒͷσόΠεʣ ◦ ࠓळʹiOS15͕ϦϦʔε༧ఆ • εϖʔεϚʔέοτ
◦ iOS12ҎԼͷαϙʔτΛΔ͜ͱ͕Ͱ͖Δ iOS13.0ʹ͢Δ͜ͱ͕Մೳ
26 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ ʢཁ݅Λຬͨ͢͜ͱ͕Ͱ͖Δ͔ʣ
27 SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ • σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ ◦ ຊ࣮͢Δલʹ͋Δఔ༻͢ΔAPIͳͲΛ֬ೝ • ϗʔϜը໘ͷ࣮ͷͨΊɺͳΔ͘ϦεΫΛආ͚࣮͕ͨͰ͖Δ͔ʁ ◦ Λ͚࣮͕ͨͰ͖Δ͔֬ೝ
◦ iOS13ಛ༗ͷΛճආ
28 σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ
29 σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ • Ϧετදࣔʢ֊ʣ • CellͷλοϓʹΑͬͯల։ঢ়ଶΛ੍ޚͰ͖Δ ྫ͑ɺҎԼͷը໘͕࡞Ͱ͖Δͷ͔Λ֬ೝͯ͠ΈΔ
30 σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ • ListʢchildrenʣΛ༻͢Δํ๏ • DisclosureGroupΛ༻͢Δํ๏ ͜ΕΒͷ࣮ํ๏Ͱ࣮ݱͰ͖Δ͜ͱΛ֬ೝ // isExpanded: ల։ϑϥά
DisclosureGroup( isExpanded: $isExpanded, content: { // ࢠΧςΰϦCell }, label: { // ΧςΰϦCell } ) // categories: ΧςΰϦʔͷྻ List(categories, children: \.children) { item in // ࢠΧςΰϦCell }
31 σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ • ListʢchildrenʣΛ༻͢Δํ๏ • DissclosureGroupΛ༻͢Δํ๏ ͜ΕΒͷ࣮ํ๏Ͱ࣮ݱͰ͖Δ͜ͱΛ֬ೝ // isExpanded: ల։ϑϥά
DisclosureGroup( isExpanded: $isExpanded, content: { // ࢠΧςΰϦCell }, label: { // ΧςΰϦCell } ) // categories: ΧςΰϦʔͷྻ List(categories, children: \.children) { item in // ࢠΧςΰϦCell } ଞͷը໘࣮ݱՄೳͰ͋Δ͜ͱΛ֬ೝ͠ ·ͨ͠ɻ ※ ຊ࣮ͯ͠Έͳ͍ͱΘ͔Βͳ͍ଟ͍ͷ Ͱɺ͋͘·ͰβοΫϦͱ֬ೝ͠·ͨ͠ɻ
32 ϦεΫΛආ͚࣮͕ͨͰ͖Δ͔ʁ ʢΛ͚࣮ͨʣ
33 UIKitͱซ༻࣮ͨ͠
34 UIKitͱซ༻࣮ͨ͠ • SwiftUIͰ࡞ͨ͠ը໘ΛViewͱͯ͠ѻ͏͜ ͱͰॊೈʹରԠ ◦ ͕͠ൃੜͨ͠߹ʹɺ෦త ʹ༻͢Δ͜ͱͳͲॊೈʹରԠՄೳ • ίϯτϩʔϥʔ෦ͷෆ۩߹க໋తͳӨڹΛ
༩͑ΔڪΕ͕͋ΔͨΊɺViewControllerʹ Λ࣋ͨͤΔߏͰ࣮ • UIHostingControllerΛͬͯUIKitଆ͔Β SwiftUIͰ࡞ͨ͠ΦϒδΣΫτΛੜͰ͖Δ
35 SwiftUIΛΈࠐΉίʔυ // HomeContainerView: SwiftUIͰ࡞ͨ͠ը໘ let homeContainerVC = UIHostingController(rootView: HomeContainerView())
guard let homeContainerView = homeContainerVC.view else { return } self.addChild(homeContainerVC) homeContainerVC.didMove(toParent: self) self.view.addSubview(homeContainerView) // Auto Layout੍Λઃఆ homeContainerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ homeContainerView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 0.0), homeContainerView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor, constant: 0.0), homeContainerView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0.0), homeContainerView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0.0) ])
36 UIKitͱซ༻࣮ͨ͠ SwiftUIͰ࡞ͨ͠ViewΛѻ͍͘͢͢ΔͨΊʹ • delegate ◦ ΞΫγϣϯͷॲཧ • dataSource ◦
σʔλͷߋ৽
37 Delegate λοϓΞΫγϣϯ
38 Delegate /// DelegateΛఆٛ protocol BannerViewDelegate: AnyObject { func didSelectBanner(uid:
String) } /// BannerViewDelegateͷॲཧ extension HomeViewController: BannerViewDelegate { func didSelectBanner(uid: String) { // ը໘ભҠͷॲཧ } } HomeViewController.swift struct BannerView: View { weak var delegate: BannerViewDelegate? var body: some View { // όφʔը૾ʹରͯ͠onTapGestureΛઃఆ Image(”όφʔը૾”) .onTapGesture { self.delegate?.didSelectBanner(uid: "όφʔUid") } } } BannerView.swift
39 DataSource /// ObservableObjectϓϩτϩϧΛܧঝͨ͠ΫϥεͰఆٛ͢Δ class DataSource: ObservableObject { @Published var
banners: [Banner] = [] } // Λߋ৽͢Δ BannerView.DataSorce.banners = ["όφʔใ"] σʔλΛऔಘ dataSourceʢObservedObjectʣ ͷΛࢹ͍ͯ͠ΔͨΊɺ ʢbannersʣ͕ߋ৽͞Εͨ߹ Viewͷ࠶ඳը͕ߦΘΕΔ ᶃ ᶄ ᶅ dataSourceʢObservedObjectʣ ʹऔಘͨ͠σʔλΛ͢
40 • SwiftUIͰ࡞ͨ͠ը໘ΛViewͱͯ͠ѻ͏͜ ͱͰϦεΫϔοδʢॊೈʹରԠͰ͖Δʣ • delegate, dataSourceͳͲఆٛͯ͠ѻ͍͢ ࣮͘ UIKitͱซ༻࣮ͨ͠
41 ϦεΫΛආ͚࣮͕ͨͰ͖Δ͔ʁ ʢiOS13ಛ༗ͷΛճආʣ
42 iOS13ಛ༗ͷΛճආ • ಈ࡞͕ෆ҆ఆͱ͍͏ใࠂ͕͋Δ ◦ SwiftUI NavigationView broken in iOS
13.3 ◦ ϚΠφʔόʔδϣϯʹΑͬͯڍಈ͕มΘΔ • iOS13Ͱ༻Ͱ͖ΔAPI͕ݶΒΕ͍ͯΔ ◦ ༻Ͱ͖ΔAPIͷΈͰ࣮͠Α͏ͱ͢ΔͱɺύϑΥʔϚϯεΛམͱ͢ڪΕ͕͋Δ ʢLazyܥͳͲ͕༻Ͱ͖ͳ͍ͨΊʣ ◦ ࣮ʹ͕ඞཁʢUIKitΛϥοϓͯ͠༻͢ΔͳͲʣ ɹɹɹ˞ UIKitͱൺͯSwiftUIػೳ͕ෆ͍ͯ͠Δ
43 iOS13 iOS14+ iOSόʔδϣϯʹΑͬͯग़͚͍ͯ͠Δ
44 SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ • σβΠϯ௨Γͷը໘Λ࡞Ͱ͖Δͷ͔ʁ ◦ ͋Δఔ࣮ΠϝʔδͰ͖ͨ • ϗʔϜը໘ͷ࣮ͷͨΊɺͳΔ͘ϦεΫΛආ͚࣮͕ͨͰ͖Δ͔ʁ ◦ SwiftUI͋͘·ͰViewͱͯ͠׆༻͢Δ
◦ iOS14Ҏ্Ͱ৽͍͠ϗʔϜը໘Λදࣔ͢Δ ཁ݅Λຬ࣮͕ͨͨ͠Մೳ
45 3. ϝϦοτ͕͋Δ͔ʁ
46 ϝϦοτ͕͋Δͷ͔ʁ • কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮ྫ͕Ͱ͖Δ • UIߏஙͷ։ൃޮ্͕͢ΔݟࠐΈ͕͋Δ ◦ ຊ࣮͢Δલʹײ৮Λ֬ೝ
47 • એݴܕγϯλοΫεͰײతͳίʔσΟϯά͕Ͱ͖Δ ◦ σβΠφʔͳͲͱׂ୲ͳͲՄೳ • ϏϧυճΛݮΒ͢͜ͱͰɾετϨεݮ ͜Ε·Ͱͷ σόοάखॱ ։ൃޮ্͕͢ΔݟࠐΈ͕͋Δ
UIߏங Ϗϧυ ֬ೝ͍ͨ͠ ը໘ભҠ ֬ೝ UIߏங Ϗϧυ ֬ೝ ϓϨϏϡʔͷ σόοάखॱ ͜ͷ෦ʹ࣌ؒΛཁ͍ͯͨ͠
48 ϝϦοτ͕͋Δͷ͔ʁ • কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮ྫ͕Ͱ͖Δ • UIߏஙͷ։ൃޮ্͕͢ΔݟࠐΈ͕͋Δ ◦ ײతͰ࣮͍͢͠ ◦ σβΠφʔͱׂ୲͘͢͠ͳΔ
◦ σόοάָ͕ ಋೖΛਪͤΔϝϦοτ͕͋Δ
49 Ҏ্ɺݕ౼ͷ݁Ռ
50 SwiftUIಋೖલͷݕ౼݁Ռ 1. αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ ◦ શମతɾεϖʔεϚʔέοτΞϓϦͷར༻ঢ়گΛؑΈͯɺ iOS13.0ʹ͋͛Δ͜ͱ͕Մೳ 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ
◦ ༻͢ΔAPIͳͲ֬ೝΛߦ͍ɺ࣮ͷఆ͕Ͱ͖ͨ ◦ UIKitͱซ༻࣮ͨ͠Λߦ͏͜ͱͰɺͰ͖Δ͚ͩϦεΫΛԼ࣮͕͛ͨͰ͖Δ ◦ ৽͍͠ϗʔϜը໘iOS14Ҏ্ͰରԠ͢ΔΑ͏ʹ͢Δ 3. ϝϦοτ͕͋Δ͔ʁ ◦ UIߏஙͷ࡞ۀޮ্͕ݟࠐΊΔ ◦ σβΠφʔͱͷ࡞ۀ୲Ͱ͖ͦ͏ ◦ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮༻ྫ͕Ͱ͖Δ OK OK OK
51 SwiftUIಋೖલͷݕ౼݁Ռ 1. αϙʔτΛiOS13.0Ҏ্ʹͰ͖Δ͔ʁ ◦ શମతɾεϖʔεϚʔέοτΞϓϦͷར༻ঢ়گΛؑΈͯɺ iOS13.0ʹ͋͛Δ͜ͱ͕Մೳ 2. SwiftUIͰߏஙՄೳͳը໘ͳͷ͔ʁ
◦ ༻͢ΔAPIͳͲ֬ೝΛߦ͍ɺ࣮ͷఆ͕Ͱ͖ͨ ◦ UIKitͱซ༻࣮ͨ͠Λߦ͏͜ͱͰɺͰ͖Δ͚ͩϦεΫΛԼ࣮͕͛ͨͰ͖Δ ◦ ৽͍͠ϗʔϜը໘iOS14Ҏ্ͰରԠ͢ΔΑ͏ʹ͢Δ 3. ϝϦοτ͕͋Δ͔ʁ ◦ UIߏஙͷ࡞ۀޮ্͕ݟࠐΊΔ ◦ σβΠφʔͱͷ࡞ۀ୲Ͱ͖ͦ͏ ◦ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮༻ྫ͕Ͱ͖Δ OK OK OK SwiftUIಋೖࢸΓɺ ແࣄෆ۩߹ͳ࣮͘Λߦ͏͜ͱ͕ Ͱ͖·ͨ͠🙌
52 ·ͱΊ
53 ·ͱΊ • SwiftUIͷಋೖʹ͍ͭͯ ◦ ϝϦοτ ▪ UIKitͱΈ߹ΘͤͯॊೈʹରԠͰ͖Δ ▪ UIߏஙʹؔͯ͠࡞ۀޮUP͕ݟࠐΊΔ
▪ কདྷతʹΩϟονΞοϓ͕ඞཁͳٕज़ͷݕূɾ࣮ྫ͕Ͱ͖Δ ◦ σϝϦοτ ▪ UIKitͱൺͯΓͳ͍ػೳ͕ଟʑ͋Δ ▪ iOS13Ͱͷ࣮͕ඞཁ ʢiOS14αϙʔτޙʹಋೖͨ͠ํ͕҆ఆ͢Δͱࢥ͍·͢ʣ
54 ·ͱΊ • ͜Ε͔Β ◦ αϙʔτόʔδϣϯͷϝϯςφϯεΛܧଓతʹߦ͏͜ͱ͕େࣄ ▪ SwiftUI༻͢Δɾ͠ͳ͍ʹؔΘΒͣɺศརͳAPI͕༻Ͱ͖Δ ◦ WWDC21Ͱ৽ͨʹ༻Ͱ͖ΔAPI͕ެ։͞Εɺࠓޙ͍উख͕ྑ͘ͳΔ
▪ ࠷৽ٕज़ͷΩϟονΞοϓͯ͠ɺΑΓྑ͍ϓϩμΫτΞοϓσʔτʂ • ΑΓৄ͍͠༰ͪ͜Β ◦ SwiftUIͰ࣮ͨ͠৽͍͠ϗʔϜը໘ΛϦϦʔε͠·ͨ͠ ◦ SwiftUIͰΧϧʔηϧΛ࣮͢Δ
None