【SwiftUI】delegateを理解してUIKitの機能をSwiftUIで利用する
・SwiftUIを中心に学習している方のdelegateの理解
上記の内容とこのページを左右に開き(2画面など)比較しながら進めると理解がより深まると思います。
はじめに
SwiftUIでUIKitの機能を利用する
iPhoneのカメラ機能を例題とする
・UIKitのカメラ機能をSwiftUIで使用できるようにする
・そのためにはdelegateを使用する
整理しておくとこ
必要なもの
プロトコル
任せるクラス
任されるクラス
プロトコル
・条件・約束事
任せるクラス
・Bigカンパニーとイメージ
任されるクラス
・Bigカンパニーの下請け会社
全体のイメージ

内容・詳細
構造体

構造体はSwiftUIでUIKitの機能を利用するための大枠となるとこです。この構造体が呼ばれることでdelegateパターンの処理がり、UIKitのカメラ機能を利用します。
・構造体がUIViewControllerRepresentableプロトコルに準拠することでUIKitのUIImagePickerControllerクラスを利用できるようになる
(上記はそうなんだくらいの理解で大丈夫です)
プロトコル

これが条件・約束事です。
詳しい内容は下記のようになっています。
@MainActor public protocol UIImagePickerControllerDelegate : NSObjectProtocol {
@available(iOS 2.0, *)
optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
@available(iOS 2.0, *)
optional func imagePickerControllerDidCancel(_ picker: UIImagePickerController)
}
Bigカンパニー

//UIImagePickerControllerクラスのインスタンスを生成
let myImagePickerController = UIImagePickerController()
BigカンパニーはUIImagePickerControllerクラスとなります。
Bigカンパニーの下請け

class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate
クラス CoordinatorがBigカンパニーの下請けとなります
まとめ
いかがでしょうか?
3役登場しましたね。
今一度、 下記の記事と比較してみてください
【SwiftUI】delegateを理解してUIKitの機能をSwiftUIで利用する
・SwiftUIを中心に学習している方のdelegateの理解
上記の内容とこのページを左右に開き(2画面など)比較しながら進めると理解がより深まると思います。
Bigカンパニーは
@MainActor open class UIImagePickerController : UINavigationController, NSCoding {
...
weak open var delegate: (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
...
}
上記のコードでわかるようにUIImagePickerControllerDelegateプロトコルが内容としてあります。
下請けさんは
CoordinatorクラスとしてUIImagePickerControllerDelegateプロトコルに準拠して、
func imagePickerController と func imagePickerControllerDidCancel 処理の内容を記載している状態です。
プロトコルは
上記で登場しているように UIImagePickerControllerDelegate です。
あとは実装ですが
//delegate設定
myImagePickerController.delegate = context.coordinator
最上図の実装と記載されている内容です。
呼び出されると実行される
あとは、SwiftUIの構造体が呼び出しされるとBigカンパニーがdelegateをとうして下請け会社に依頼する。依頼された下請けは、依頼された内容のイベントが発生したら処理をする。
このケース場合だと下請けが処理をする内容は、とある2つのイベントが発生したら構造体のブール値をfalseに変更。それに構造体が反応して、この構造体自体が終了する。という仕組みになっている。
最後に
いかがだったでしょうか。簡単ではありますが、これがSwiftUIでUIKitの機能を利用するです。
あくまでも、独学・自己流ですので何かご指摘があればご指導よろしくお願いします。
参考
藤 治仁・小林 加奈子・小林 由憲. SwiftUI 対応 たった2日でマスターできるiPhone アプリ開発集中講座 Xcode 13/iOS 15/Swift 5.5対応. ソシム株式会社、2021、p304-p335.
コメント