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導入方針とTips / Rakuma SwiftUI Introduc...
Search
darquro
February 16, 2022
Programming
2
4.9k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
『ラクマ x STORES LTイベント ~ iOS開発の裏側 ~』での登壇資料
https://hey.connpass.com/event/236189/
darquro
February 16, 2022
Tweet
Share
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
930
Jailbreakと向き合おう
darquro
0
2.2k
Half modal comparision in iOS15
darquro
2
1.8k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
110
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.6k
iOS View Class Design Basic
darquro
3
730
Swift 5 Exclusivity Enforcement
darquro
4
760
SDK連携を用いたAdMob活用法
darquro
1
990
ContributingSwift
darquro
0
78
Other Decks in Programming
See All in Programming
Software Architecture
hschwentner
6
2.1k
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
660
データの整合性を保つ非同期処理アーキテクチャパターン / Async Architecture Patterns
mokuo
41
15k
How mixi2 Uses TiDB for SNS Scalability and Performance
kanmo
29
11k
ASP. NET CoreにおけるWebAPIの最新情報
tomokusaba
0
360
[Fin-JAWS 第38回 ~re:Invent 2024 金融re:Cap~]FaultInjectionServiceアップデート@pre:Invent2024
shintaro_fukatsu
0
400
Writing documentation can be fun with plugin system
okuramasafumi
0
120
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
110
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
2024年のWebフロントエンドのふりかえりと2025年
sakito
1
230
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
640
負債になりにくいCSSをデザイナとつくるには?
fsubal
9
2.3k
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
540
Six Lessons from altMBA
skipperchong
27
3.6k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
How to train your dragon (web standard)
notwaldorf
90
5.8k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
Automating Front-end Workflow
addyosmani
1367
200k
Unsuck your backbone
ammeep
669
57k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
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 🥳