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
既存アプリへのSwiftUI導入事例
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Takashico
July 05, 2021
Programming
780
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
既存アプリへのSwiftUI導入事例
Takashico
July 05, 2021
More Decks by Takashico
See All by Takashico
Translation APIをUIKitでも使ってみたい
takashico
1
500
Other Decks in Programming
See All in Programming
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
220
Oxcを導入して開発体験が向上した話
yug1224
4
330
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
140
AIを活用したE2Eテスト実装効率化のあゆみ / ebisu-mobile-14-kotetu
kotetuco
0
130
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
580
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
170
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
Inside Stream API
skrb
1
760
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
560
Vite+ Unified Toolchain for the Web
naokihaba
0
330
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
The agentic SEO stack - context over prompts
schlessera
0
820
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
170
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Code Review Best Practice
trishagee
74
20k
So, you think you're a good person
axbom
PRO
2
2.1k
WENDY [Excerpt]
tessaabrams
11
38k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
A better future with KSS
kneath
240
18k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
180
The Spectacular Lies of Maps
axbom
PRO
1
820
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