问题描述
我是编程初学者,刚刚添加了一个自定义标签栏以允许在整个应用程序中导航。但是,由于我添加了属性包装器来让这种情况发生,因此出现错误:
'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)
}
}
}
注意:如果需要,传入 init
的 ViewRouter
所需的任何内容。