SwiftUI-应用程序不符合协议“应用程序”

问题描述

我是编程初学者,刚刚添加一个自定义标签栏以允许在整个应用程序中导航。但是,由于我添加属性包装器来让这种情况发生,因此出现错误

'app 不符合协议'App''。

它迫使我添加 init() 协议存根,但我似乎无法让它工作 - 因此我可以通过代码运行而不会出现错误“从初始化程序返回而不初始化所有存储的属性”。我已经尝试了一切,但它仍然不会消失。

如果相关的话,我昨晚更新了 Xcode,但直到我今天开始处理我的项目时才出现错误

这里是错误的来源

import SwiftUI
import Firebase

@main
struct PhotoApp: App {

    init () {
        FirebaseApp.configure()
    }

    @StateObject var viewRouter: ViewRouter
    
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(viewRouter)
        }
    }
}

解决方法

您需要初始化 viewRouter。它给您一个错误的原因是 PhotoApp 不符合 App。这是因为在 App 协议的定义中,init 是必需的:

/// Creates an instance of the app using the body that you define for its
/// content.
///
/// Swift synthesizes a default initializer for structures that don't
/// provide one. You typically rely on the default initializer for
/// your app.
init()

如果您不提供 viewRouter 值,则使用结构的成员初始值设定项。当我们只想要 init(viewRouter: ViewRouter) 时,它会是 init()

如果没有 init()viewRouter 设置默认值或直接这样做,您会收到错误“从初始化程序返回而不初始化所有存储的属性”。

以下内容对您有用:

import SwiftUI
import Firebase

@main
struct PhotoApp: App {

    init () {
        FirebaseApp.configure()
    }

    @StateObject var viewRouter: ViewRouter = ViewRouter()
    
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(viewRouter)
        }
    }
}

注意:如果需要,传入 initViewRouter 所需的任何内容。