Невозможно преобразовать элемент ForEach L oop в NSManagedObject Subclass SwiftUI - PullRequest
0 голосов
/ 09 мая 2020

Я получил ListView в SwiftUI и хочу сгенерировать RowViews в зависимости от заданного свойства. Поэтому я хочу проверить свойство элемента в ForEach l oop.

Xcode не распознает тип элемента, поэтому я хочу привести элемент к правильный класс, который является подклассом NSManagedObject .

Я создал подкласс NSManagedObject из xcdatamodeld (Editor -> Create NSManagedObject Subclass ...).

Подкласс NSManagedObject - это создан в objective- c, и я добавил файл .h в заголовок моста.

У меня нет проблем с работой с подклассом NSManagedObject в остальной части проекта. Я даже могу создать свойство этого типа в той же структуре, например:

struct MyListView: View {

    var test : MyNSManagedObjectSubclass //Xcode does recognize it here

По какой-то причине Xcode не распознает подкласс NSManagedObject внутри ForEach L oop.

код выглядит так:

struct MyListView: View {

    var test : MyNSManagedObjectSubclass //Xcode does recognize it here
    @EnvironmentObject private var fetchResultsContainer : FetchedResultsContainer

    var body: some View {
        NavigationView{
            VStack{
                ForEach(fetchResultsContainer.results , id: \.identifier) { result in
                    if let castedResult = result as! MyNSManagedObjectSubclass { //Xcode does not recognize it here
                        if castedResult.property{
                            ResultRowView(input: result)
                        }
                    }
                }
            }
        }
    }
}

FetchedResultsContainer:

@objc class FetchedResultsContainer : NSObject, ObservableObject{

    @objc @Published var results: [MyNSManagedObjectSubclass]()

    @objc static let sharedInstance: FetchedResultsContainer = {
        let instance = FetchedResultsContainer()

        return instance
    }()
}

Я чувствую, что мне не хватает чего-то очевидного, поскольку я все еще новичок в Swift и SwiftUI. Цените вашу помощь.

1 Ответ

0 голосов
/ 10 мая 2020

Хорошо, сделав шаг назад и просто закодировав его снова с нуля, он просто сработал, кастинг не потребовался ...

List(fetchResultsContainer.results, id: \.identifier) { result in
    if (result.property == 0) {
    //do something
    }
}

Мое предположение, что преобразование не работает, было неверным. Я, вероятно, проверил result.property == false, где property относится к типу NSNumber, и он выдал некоторые странные ошибки компиляции, которые привели меня на неправильный путь.

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