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.2k
ラクマでの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
970
Jailbreakと向き合おう
darquro
0
2.4k
Half modal comparision in iOS15
darquro
2
2k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
120
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
darquro
3
1.6k
iOS View Class Design Basic
darquro
3
760
Swift 5 Exclusivity Enforcement
darquro
4
820
SDK連携を用いたAdMob活用法
darquro
1
1k
ContributingSwift
darquro
0
85
Other Decks in Programming
See All in Programming
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
87
29k
iOS 26にアップデートすると実機でのHot Reloadができない?
umigishiaoi
0
130
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
7.4k
RailsGirls IZUMO スポンサーLT
16bitidol
0
190
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
220
Flutterで備える!Accessibility Nutrition Labels完全ガイド
yuukiw00w
0
160
The Modern View Layer Rails Deserves: A Vision For 2025 And Beyond @ RailsConf 2025, Philadelphia, PA
marcoroth
1
170
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
590
ソフトウェア品質を数字で捉える技術。事業成長を支えるシステム品質の マネジメント
takuya542
1
13k
明示と暗黙 ー PHPとGoの インターフェイスの違いを知る
shimabox
2
510
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
220
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
150
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
181
54k
Code Review Best Practice
trishagee
69
18k
A designer walks into a library…
pauljervisheath
207
24k
It's Worth the Effort
3n
185
28k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
107
19k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
A Tale of Four Properties
chriscoyier
160
23k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
510
Scaling GitHub
holman
460
140k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
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 🥳