【SwiftUI】@UIApplicationDelegateAdaptor で AppDelegate を利用する

Xcode12&iOS14 から導入された新ライフサイクルである SwiftUI App でプロジェクトを作成するとまず困惑するのが AppDelegate と SceneDelegate がなくなっていることです。

代わりに App プロトコルを継承した struct が定義されています。

@main
struct TestApp: App {
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

アプリケーション開始時に何か初期化コードを実行したいときはどうすればいいんだろう、となると思います。今回は手っ取り早い解決策として @UIApplicationDelegateAdaptor を使う方法を紹介します。

@UIApplicationDelegateAdaptor で AppDelegate を利用する

SwiftUI App で AppDelegate を利用するには @UIApplicationDelegateAdaptor を使用します。

@main
struct TestApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

そして、UIApplicationDelegate プロトコルを継承した実体の AppDelegate クラスを定義します。基本的に今までと同じです。

class AppDelegate: NSObject, UIApplicationDelegate {
・・・
}

何か初期化コードを差し込む場合(例えば Firebase の初期化コードなど)は以下のように didFinishLaunchingWithOptions のメソッドで行います。

class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        FirebaseApp.configure()
        return true
    }
}

わざわざ AppDelegate を自分で定義しなくてはならないところを考えると、これが SwiftUI App としての正解かと言うととちょっと疑問符が生じます。

SwiftUI App についてはまた別の記事で解説してみたいと思います。

以上