【SwiftUI】delegateをより深く理解してUIKitの機能をSwiftUIで利用する

【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.


コメント

タイトルとURLをコピーしました