Open5
【SwiftUI】UIKitを使う際の知識

SwiftUIとUIKitのViewの構築方法の違い
- SwiftUIのViewは構造体なのに対して、UIKitのViewはクラスで生成されているという違いがある。
- SwiftUIのViewは宣言型で記述するのに対して、UIKitのViewは手続き型で記述するという違いがある。
- SwiftUIでは外観の構築に焦点を当てている。状態の変更などによって自動的にViewは更新される。
- UIKitではプロパティの値が変更された場合には手動で更新する必要がある。
- UIKitではdelegateという概念があるが、SwiftUIにはdelegateがない。

ViewControllerとは
- その名の通りViewの動作を管理するオブジェクト。
- Viewの階層の管理
- ユーザーが入力したイベントの処理
- データオブジェクトとViewの仲介。
- Viewが作成するリソースの管理
- UIKitの組み込みクラスであるUIViewControllerのサブクラスとして作成する。
View Controller Programming Guide for iOS: The Role of View Controllers

UIView
UIKit上でViewを構築する基底クラスである。
全てのViewはUIViewクラスを継承しており、例えば下記のようなものが組み込みで存在する。
- UILabel
- UIButton
- UITableView
- UITextField
- UISearchBar

UIViewRepresentableの使い方
SwiftUIでUIKitのViewを使うためのプロトコル
makeUIViewとupdateUIViewの2つのViewの実装が必要になる。
makeUIView
func makeUIView(context: Self.Context) -> Self.UIViewType
makeUIViewメソッドの構文は上記のようになっており、引数のcontextにはSelf.Context、戻り値の型はSelf.UIViewTypeが指定されている。
Selfとあることから引数はUIRepresentableを継承したクラスのContextであり、戻り値は最終的にSwiftUI上に表示したいUIKitのViewの型を指定することになる。
struct CustomView: UIViewRepresentable {
typealias Context = UIViewRepresentableContext<Self>
func makeUIView(context: Context) -> UIView {
// UIViewを返す処理
}
updateUIView
func updateUIView(
_ uiView: Self.UIViewType,
context: Self.Context
)
こちらはUIViewの状態をSwiftUIのViewライフサイクルに則って更新するメソッド。
引数自体はmakeUIViewのものと変わらない。
makeUIViewはあくまで最初にUIViewのインスタンスを作成するのに使用し、更新する際はupdateUIViewメソッドを使用する。

Coordinatorクラス
- UIKitのUIViewクラスには通常、ユーザーからの入力を処理できるdelegateが存在する。
- delegateなどのUIKitが持つ働きをSwiftUI上でも実行するために、Coordinatorというオブジェクトを使った仕組みが存在する。CoorinatorがSwiftUIViewとUIKitViewの橋渡しを行う。
- makeCoordinatorメソッドはmakeUIViewクラスより先に実行される。
- makeCoordinatorでCoodinatorクラスのインスタンスを生成する。
- UIViewのdelegateにcoordinator(context.coodinator)を渡す。
UIViewRepresentableのCoordinatorはなぜ必要か
Using UIKit views in SwiftUI