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 についてはまた別の記事で解説してみたいと思います。
以上
コメントを残す