如何解决Swift 5.1中的“使用未声明类型”错误?

时间:2019-10-25 04:40:44

标签: swift swiftui

我是Swift和iOS开发的新手,并尝试通过遵循官方的SwiftUI教程进行学习。我在第5节(https://developer.apple.com/tutorials/swiftui/handling-user-input)中遇到错误。我认真地执行了每个步骤,在执行了第5部分的步骤1之后,Xcode弹出错误“使用未声明的类型'UserData'”。我试着无视并遵循。但是,我的LandmarkList,LandmarkDetail,SceneDelegate文件警告我相同的错误。我什至检查了从教程页面下载的项目的完整版本。除了未完成的部分外,它们看上去完全相同。在座的人有和我相似的经历吗,或者您能提供一些建议吗?谢谢!

我正在使用Xcode 11和Swift 5。

这是我在Models文件夹下创建的UserData类。

import Combine
import SwiftUI

final class UserData: ObservableObject {
    @Published var showFavoritesOnly = false
    @Published var landmarks = landmarkData
}

这是不断提示错误的rootview文件。

import SwiftUI

struct LandmarkList: View {
    @EnvironmentObject private var userData: UserData  // Use of undeclared type 'UserData'

    var body: some View {
        NavigationView {
            List { // Unable to infer complex closure return type; add explicit type to disambiguate
                Toggle(isOn: $userData.showFavoritesOnly){ // Use of unresolved identifier '$userData'
                    Text("Favorites Only")
                }

                ForEach(userData.landmarks) { 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()) // Use of unresolved identifier 'UserData'
    }
}

3 个答案:

答案 0 :(得分:3)

您需要清理并关闭Xcode,然后删除“派生数据”,然后重新打开Xcode。我在做苹果教程时一直遇到这个问题。

答案 1 :(得分:1)

不需要删除派生数据文件夹或退出Xcode。只需在教程第5节第5步之后关闭项目,然后打开项目,使其索引建立,然后执行第6步即可。这使项目可以在内存中重建其缓存。

答案 2 :(得分:0)

import re max(map(len, re.findall('(?:%s)+' % re.escape(b), a))) // len(b) 应该放在.environmentObject(UserData())上,而您应该放在LandmarkList()上。

ForEach()

编辑:进一步调查似乎不是实际问题。 Landmarks应用程序在Xcode版本11.2 beta 2(11B44)上对我来说运行良好。可能是您需要清理Xcode并清除Derived Data文件夹,然后重新启动Xcode。