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

Swift言語

interfaceがSwiftUIの方向けの記事です
SwiftUIのみの学習をしている

はじめに

整理しておきたいこと

・2023年現在、Xcodeでinterfaceをstoryboardにしてプロジェクトを作成した際には「AppDelegate.swift」ファイルがデフォルトで作成されます。
しかし、interfaceをSwiftUIにしてプロジェクトを作成する場合「AppDelegate.swift」は作成されません。

・インターフェースの違いで表示の有無がある「AppDelegate.swift」とはなんなのだろうか?

・delegateでいったい何ができるかわからない。

・delegateを使用するということは、SwiftUIでUIKitの機能を利用するということに等しい。

このテーマを取り上げたきっかけ

公開に至ったSwiftUIで作成したアプリケーションにGoogle AdMob広告を実装した際に必要な知識だったがあまり理解できていなかった。
公開したアプリに他のものも実装することが必要となり、より深く理解をする必要性がでてきた。

UIKitとSwiftUIを比較

UIKitとは

・フレームワークである。(iOS, iPadOS, tvOS アプリ用の駆動型 UI を構築・管理)
・Xcodeを使用する際に、interfaceはStoryboardを使用する。
・言語はSwift
・SwiftUIができる前から使われており、機能が充実している。
AppDelegate.swift ファイルがデフォルトである
クラスで定義されている

その他は下記を参照

参考:公式ドキュメンテーション / UIKit

SwiftUIとは

・フレームワークである。(すべてOSでアプリの UI と動作を宣言)
・Xcodeを使用する際に、interfaceはSwiftUIを使用する。
・言語はSwift
・新しくできたもので UIKit と比べると使用できる機能が少ない
AppDelegate.swift ファイルがない
構造体で定義されている

その他は下記参照

参考:公式ドキュメンテーション / SwiftUI

2つの違いとは

・インターフェースが異なるためXcodeを使用する際の見た目や操作方法が違う。大きなイメージで表現するならば、表計算ソフトを使用するとしてMacのNumbersを使用するか、WindowsのExcelを使用するかのように。

・そもそも大元の定義が異なるため、AppDelegate.swiftファイルがない。
(なぜないのか→今後の課題)

・ライフサイクルが違う??
(今後の課題)

2つを比較してわかったdelegateの詳細・正体

・UIKitでは使用することが頻繁にある。
・デザインパターンである。
・Google AdMobでgoogleのフレームワークを実装するように、delegateを使わなくてはならない場合がある。
・delegateの学習をしようとするとUIKit、Storyboardでのものの例題が多い。
・SwiftUI 一択で学習している者にはUIKit、Storyboardの例題では理解が難しい。

「delegate(デリゲート)とは、あるクラスで行いたい処理の一部を他のクラスに任せたり、任せた処理を指定したクラスに通知する仕組みです。」

藤 治仁・小林 加奈子・小林 由憲. SwiftUI 対応 たった2日でマスターできるiPhone アプリ開発集中講座 Xcode 13/iOS 15/Swift 5.5対応. ソシム株式会社、2021、p320.

ここまでのまとめ

・delegateとはUIKit、Storyboardを中心に使用されていたデザインパターンである。
・クラス定義したものの間で使用する処理である。

SwiftUIのような構造体中心のものでも、delegateを使う機会はあるのだがどのようにdelegateを使用すれば良いのか?

SwiftUIを中心に学習している方のdelegateの理解

delegateを理解する

・プロトコルが必要
・任せるクラスが必要
・任されるクラスが必要

自己流の理解のため誤っていたりしたら、教えてください。


delegateを理解するためのイメージ・例題

プロトコル
・条件、約束事とする

任せるクラス
・大元のBigカンパニー

任されるクラス
・Bigカンパニーの下請け会社


シチュエーション:Bigカンパニーは食品関係の大企業である。この度、ビザとカレーの新製品を発売するとこにした。今回の商品はすべて下請けに仕入れと製造を任せて自社の製品として売り出す。2社間では仲介人をとうして打ち合わせなどを行う。


Bigカンパニーは約束事を下請け会社とシェアする必要がある。

protocol Yakusokugoto {
    func shiire() //仕入れ
    
    func seizou() //製造
}


Bigカンパニー

class BigCompany {
    var delegate: Yakusokugoto? = nil
    func kekka() {
        if let dg = self.delegate {
            
            print("商品が開発されました。仕入れたものと製造されたものを教えてください")
            dg.shiire()
            dg.seizou()
        } else {
            print("商品は開発されていません")
        }
    }
}

下請け会社

class shitaukeCompanyAAA: Yakusokugoto {
    func shiire() {
        print("トマトとチーズを仕入れる")
    }
    
    func seizou() {
        print("トマトたっぷりピザを開発")
    }
}

class shitaukeCompanyBBB: Yakusokugoto {
    func shiire() {
        print("スパイスを仕入れる")
    }
    
    func seizou() {
        print("香り引き立つカレーを開発")
    }   
}

説明会(実行)

let product = BigCompany()

product.delegate = shitaukeCompanyAAA()
product.kekka()

product.delegate = shitaukeCompanyBBB()
product.kekka()

/*
商品が開発されました。仕入れたものと製造されたものを教えてください
トマトとチーズを仕入れる
トマトたっぷりピザを開発
商品が開発されました。仕入れたものと製造されたものを教えてください
スパイスを仕入れる
香り引き立つカレーを開発
*/

Swift の protocol は func 〜( ) 以下の{ } には 機能を実装しない

その実装しない機能の内容は下請け会社へ丸投げする。

つまり、下請け会社を変えることでいくつもの異なる実装を簡単に実現することができる。

「デリゲートは、そのオブジェクトがプログラム内のイベントに遭遇したときに、別のオブジェクトに代わって、またはそれと連携して行動するオブジェクトです。」

Apple Inc. (2012). 「Objective-Cプログラミングの概念 デリデートとデータソース」. ドキュメンテーションアーカイブ.
https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaEncyclopedia/DelegatesandDataSources/DelegatesandDataSources.html , (参照2023-08-15)

SwiftUIでのdelegateの実装例

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

参考

Apple Inc.(2023).「UIApplication」.Apple Developer Documentation.

https://developer.apple.com/documentation/uikit/uiapplication , (参照 2023-08-13)

コメント

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