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導入方針とTips / Rakuma SwiftUI Introduc...
Search
darquro
February 16, 2022
Programming
5.7k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
『ラクマ x STORES LTイベント ~ iOS開発の裏側 ~』での登壇資料
https://hey.connpass.com/event/236189/
darquro
February 16, 2022
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
1.1k
Jailbreakと向き合おう
darquro
0
3.1k
Half modal comparision in iOS15
darquro
2
3.1k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
170
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.8k
iOS View Class Design Basic
darquro
3
880
Swift 5 Exclusivity Enforcement
darquro
4
940
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
120
Other Decks in Programming
See All in Programming
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
330
外から家のPCの電源入れたい!をPHPで解決する
kawashimo0
1
130
Kubernetes祭り #2 OP/ED
bells17
0
110
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
380
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
330
Are APIs Still Relevant in the AI Era?
soyuka
0
460
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.2k
TechTown - Creating Composable Callables in Contemporary C++
rollbear
0
100
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
230
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
140
カツオ、ご期待ください
suneo3476
0
170
Compiling a real-world CLI tool to native with Static Hermes
tmikov2023
0
110
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
560
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Designing for humans not robots
tammielis
254
26k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
450
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
The Curse of the Amulet
leimatthew05
3
15k
4 Signs Your Business is Dying
shpigford
187
23k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
A Tale of Four Properties
chriscoyier
163
24k
Everyday Curiosity
cassininazir
0
350
エンジニアに許された特別な時間の終わり
watany
109
250k
Transcript
ラクマでのSwiftUI導⼊⽅針とTips @darquro Rakuten Group, Inc.
2 About Me @darquro ラクマ Mobile Application Development Group Manager
/ iOS Engineer
3 Table of Contents • ラクマでのSwiftUI導⼊⽅針 • SwiftUIでハマったこと • SwiftUI
Tips Target 既存のUIKitベースのアプリに これからSwiftUI導⼊していく⼈向け。 ※普段からSwiftUIで開発している⼈には物⾜りないかも 🙇
4 🗼 ラクマでの SwiftUI導⼊⽅針
5 SwiftUI導⼊ • 2021/2〜徐々に導⼊ • 画⾯全体もあれば、 ⼀部コンポーネントのみなど • 追加読み込み(ページング)が 不要(LazyVStackではなくListで
済む) • 複雑な状態管理が不要 という簡単な画⾯から移⾏ 🗼ラクマでのSwiftUI導⼊⽅針
6 Architecture ViewController Presenter UseCase APIClients DataStores Repositories SwiftUI View
ViewModel UseCase Use APIClient directory Use Repository Application Lifecycle Update UIKit(MVP) SwiftUI(MVVM) Presentation Layer Domain Layer Entities System User 🗼ラクマでのSwiftUI導⼊⽅針
7 ViewModel Protocol ViewModel Protocolとしてトレタさんのブログを参考に させていただきました 🙏 https://tech.toreta.in/entry/2019/12/24/104612 🗼ラクマでのSwiftUI導⼊⽅針
8 ViewModel Protocol MVVMアーキテクチャは、 単⽅向Bindingと双⽅向Binding の概念があるが、 SwiftUI+Combine標準APIでは制約はない。 Binding⽅向の制約を設けることで、コード の⾒通しを良くする。 🗼ラクマでのSwiftUI導⼊⽅針
9 ViewModel View ViewModelObject.input • View Lifecycleによる状態更新 • User Actionによる状態更新
🗼ラクマでのSwiftUI導⼊⽅針
10 ViewModel View ViewModelObject.binding • ViewとViewModel双⽅のデータ更新 🗼ラクマでのSwiftUI導⼊⽅針
11 ViewModel View ViewModelObject.output • Fetchされたデータによる画⾯更新 • Status変更による画⾯更新 🗼ラクマでのSwiftUI導⼊⽅針
12 💣 SwiftUIで ハマったところ
13 iOS13/iPadOS13のサポートは切ろう😇 • TextFieldのキーボード⼊⼒まわりの挙動がおかしい • 謎クラッシュ • 標準コンポーネントが⾜りない • Combineのqueueを跨いぐと処理がおかしい
などなどiOS13でSwiftUIを使うのは危険 💣SwiftUIでハマったところ
14 Previewがエラーになって時間ばかり取られる 🤯 Device modelを 定義しておくと便利👍📱 おかしいな…なんか変だなぁ…と感じたら、 • エディタを全部閉じる •
Xcode再起動 • Clean Build • Emulatorの起ち上げ直し • DerivedData削除 最後は諦めてEmulatorで確認 💣SwiftUIでハマったところ ちなみに…
15 if statementを多⽤しない⚠ Xcodeのcode completionがぶっ壊れて まともにコードが書けなくなる 🥺 💣SwiftUIでハマったところ ViewModelでstateのような enumで条件分岐しようとすると…
16 if #available() をViewModifierで使⽤しない💥 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Thread 0
name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 8 SwiftUI 0x00000001a07f2160 partial apply for closure #1 in ModifierBodyAccessor.updateBody+ 6332768 (of:changed:) + 28 9 SwiftUI 0x00000001a0814364 closure #1 in BodyAccessor.setBody+ 6472548 (_:) + 44 10 SwiftUI 0x00000001a07f1a64 ModifierBodyAccessor.updateBody+ 6330980 (of:changed:) + 1440 11 SwiftUI 0x00000001a08144a8 StaticBody.updateValue+ 6472872 () + 208 12 SwiftUI 0x00000001a0517764 partial apply for implicit closure #2 in implicit closure #1 in closure #1 in closure #1 in Attribute.init<A>+ 3340132 (_:) + 28 Xcode13.2 で謎クラッシュが発⽣する。しかもDebugビルドでは発⽣せず、Releaseビルドのみ起こる。 @available()でView単位の出し分けにすることで回避 https://developer.apple.com/forums/thread/697070 💣SwiftUIでハマったところ
17 🎩 🪄 SwiftUI Tips
18 ViewDidLoadModifier⚡ 標準だとonAppearしかないので、deta fetch系処理を⼊れてしまうと画⾯⾏き来する度にリクエストが⾛る。 ViewDidLoadModifierを作ることで、画⾯表⽰の初回のみ呼ばれるイベントを作る。 画⾯表⽰の初回のみ呼ばれる 🎩 🪄SwiftUI Tips
19 Alert Binding ⚡ iOS15からalertのメソッドが変わった。 ただこれらだと、状態とメッセージを別々にbindする必要が出てきて、ViewModel側が冗⻑になってくる。 iOS14 iOS15 🎩 🪄SwiftUI
Tips
20 Alert Binding ⚡ iOS14にはIdentifiableをbindしてalertを出せるメソッドがあった。しかしiOS15ではなくなった。 iOS14 🎩 🪄SwiftUI Tips
21 Alert Binding ⚡ iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🧐 🎩 🪄SwiftUI Tips
22 Alert Binding ⚡ ①ObservableObjectを使ったclassを作成。 iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
23 iOS15 iOS14 Alert Binding ⚡ ②ViewModifierを作成し、iOS15以降とそれ以前の実装を書く。 ViewModifier内でif #availableで分岐するとcrashする問題があるのでViewModifier単位で分ける。 iOS14とiOS15それぞれの互換性を保ち、
ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
24 Alert Binding ⚡ ③Viewのextensionを⽤意。 iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 🎩 🪄SwiftUI Tips
25 ViewModel View Alert Binding ⚡ ViewModelからメッセージ送るだけ 実装が完結になる iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。
🎩 🪄SwiftUI Tips
26 Viewodel Alert Binding ⚡ iOS14とiOS15それぞれの互換性を保ち、 ViewModelから状態とメッセージをまとめてViewに変更を通知させたい。 ④同じ要領で、.destructiveボタンと.cancelボタンの確認アラートも作成しておくと汎⽤的に使える。 🎩 🪄SwiftUI
Tips
27 さいごに
28 ⾊々⼤変だけど、
29 やっていくしかないですね💪
Thank you 🥳