使用 SwiftUI 教程代码出现错误“无法推断通用参数‘标签’”

Sub*_*ion 7 swiftui

我正在这里完成这个 SwiftUI 教程:https : //developer.apple.com/tutorials/swiftui/handling-user-input

在“在您的视图中采用模型对象”部分的第 3 步中,我在第 16 行的 Toggle 语句中收到此错误:“无法推断通用参数‘标签’。”

我的代码与教程中提供的代码相同:

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Favorites Only")
                }
                ForEach(userData.landmarkData) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我查看“Complete”文件夹中提供的代码时,我看到它几乎相同,除了 userData 变量是私有的——我将它添加到我的“StartingPoint”版本中,尽管我无法想象它为什么会有区别,当然它仍然会给出相同的错误并且不会构建。我可以构建和运行完整版本,所以很明显,关于需要通用参数的消息是错误的,它必须与其他事情有关,例如项目在设置中的配置方式。

我记得今年夏天早些时候在教程的不同部分遇到了类似的问题,并找到了一篇文章,其中有人解释了为什么代码可以在一个项目中工作而不是另一个项目,但我现在找不到那个帖子。

有人熟悉这个问题吗?在我可以像这样在我的视图中的切换控件中引用可观察对象之前,我还需要了解如何配置我的项目吗?

krj*_*rjw 3

正如我在评论中提到的:只需在您的结构.environmentObject(UserData())中添加即可。ForEach()LandmarkList_Previews

这将导致:

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        NavigationView {
            List {
                Toggle(isOn: $userData.showFavoritesOnly) {
                    Text("Favorites Only")
                }
                ForEach(userData.landmarkData) { landmark in
                    if !self.userData.showFavoritesOnly || landmark.isFavorite {
                        NavigationLink(destination: LandmarkDetail(landmark: landmark)
                            .environmentObject(self.userData)
                        ) {
                            LandmarkRow(landmark: landmark)
                        }
                    }
                }
            }
            .navigationBarTitle(Text("Landmarks"))
        }
    }
}

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
            LandmarkList()
                .previewDevice(PreviewDevice(rawValue: deviceName))
                .previewDisplayName(deviceName)
        }.environmentObject(UserData())
    }
}
Run Code Online (Sandbox Code Playgroud)