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
5.4k
ラクマでの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
1k
Jailbreakと向き合おう
darquro
0
2.8k
Half modal comparision in iOS15
darquro
2
2.5k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
140
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.7k
iOS View Class Design Basic
darquro
3
830
Swift 5 Exclusivity Enforcement
darquro
4
870
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
100
Other Decks in Programming
See All in Programming
dchart: charts from deck markup
ajstarks
3
1k
疑似コードによるプロンプト記述、どのくらい正確に実行される?
kokuyouwind
0
390
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
180
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
660
React Native × React Router v7 API通信の共通化で考えるべきこと
suguruooki
0
100
Oxlintはいいぞ
yug1224
5
1.4k
AI時代の認知負荷との向き合い方
optfit
0
170
SourceGeneratorのススメ
htkym
0
200
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
470
AIによる高速開発をどう制御するか? ガードレール設置で開発速度と品質を両立させたチームの事例
tonkotsuboy_com
7
2.4k
Oxlint JS plugins
kazupon
1
1k
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
990
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.8k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
380
The agentic SEO stack - context over prompts
schlessera
0
650
Abbi's Birthday
coloredviolet
1
4.8k
Embracing the Ebb and Flow
colly
88
5k
A designer walks into a library…
pauljervisheath
210
24k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.6k
Building AI with AI
inesmontani
PRO
1
710
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
We Are The Robots
honzajavorek
0
170
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.7k
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 🥳