Как исправить ошибку «Использование необъявленного типа» в Swift 5.1? - PullRequest
0 голосов
/ 25 октября 2019

Я новичок в разработке Swift и iOS и попробую учиться, следуя официальным руководствам SwiftUI. Я получил ошибки в разделе 5 (https://developer.apple.com/tutorials/swiftui/handling-user-input).. Я тщательно выполнял каждый шаг, и после выполнения шага 1 раздела 5 Xcode выдавал сообщение об ошибке «Использование необъявленного типа« UserData »». Я пытался игнорировать его и выполнял его. Однако мои файлы LandmarkList, LandmarkDetail, SceneDelegate предупреждали меня об этой же ошибке. Я даже проверил законченную версию проекта, которую я скачал со страницы учебника. Они выглядели точно так же, за исключением частей, которые я не сделал. здесь есть опыт, аналогичный моему, или вы можете предложить несколько советов? Спасибо!

Я использую Xcode 11 и Swift 5.

Это класс 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'
    }
}

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Вам необходимо очистить и закрыть Xcode, затем удалить производные данные, а затем снова открыть Xcode. У меня постоянно возникала эта проблема, когда я делал уроки Apple.

0 голосов
/ 25 октября 2019

.environmentObject(UserData()) должно быть на LandmarkList(), в то время как у вас оно есть на ForEach().

struct LandmarkList_Previews: PreviewProvider {
    static var previews: some View {
        LandmarkList()
            .environmentObject(UserData())
    }
}

РЕДАКТИРОВАТЬ: Дальнейшее исследование не похоже, что этоактуальная проблема. Приложение Landmarks отлично работает для меня на Xcode Version 11.2 beta 2 (11B44). Возможно, вам нужно очистить Xcode, очистить папку Derived Data и перезапустить Xcode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...