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
Takashico
July 05, 2021
Programming
790
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
530
Other Decks in Programming
See All in Programming
初めての模倣学習とVLA
natsutan
0
500
信頼性の目標を誰も求めてない
shubox
0
490
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
130
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
350
週末にAI-DLCを本気で回したら$1,600溶けた
hbashimizu
0
130
AIと壁打ちしながら進めるコスト管理
fufuhu
2
1.9k
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
120
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
390
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
170
アクセシビリティから考える情報設計
high_g_engineer
0
290
Can LLMs Replicate 4 Years of Compose Migration? Exploring the boundaries of automation with 279 XML files from a real product
makun
0
130
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Navigating Weather and Climate Data
rabernat
0
510
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
YesSQL, Process and Tooling at Scale
rocio
174
15k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Leo the Paperboy
mayatellez
8
2.2k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Building the Perfect Custom Keyboard
takai
2
870
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