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
既存アプリへの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
540
Other Decks in Programming
See All in Programming
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
260
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
740
Jetpack Compose メカニズム
skydoves
0
450
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
140
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
710
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
180
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
一人だけ、Kiroが静止する日
hideg
0
120
FreeBSDでZabbixを動かす
kenkino
0
310
Java 27新機能 / Java 27 new features
kishida
2
150
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3k
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
The Curse of the Amulet
leimatthew05
3
15k
Fireside Chat
paigeccino
43
4k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
730
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
580
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
My Coaching Mixtape
mlcsv
0
320
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