1

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

'应用程序不符合协议'应用程序' '。

它迫使我添加 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)
        }
    }
}
4

1 回答 1

2

您需要初始化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

于 2021-02-06T17:11:51.793 回答