首页 > 解决方案 > 无法将 ForEach 循环中的元素转换为 NSManagedObject 子类 SwiftUI

问题描述

我在SwiftUI中获得了一个 ListView,并希望根据给定的属性生成 RowViews。因此我想检查ForEach循环中元素的属性。

Xcode 无法识别元素的类型,这就是为什么我想将元素转换为正确的 Class ,即NSManagedObject Subclass

我从 xcdatamodeld (Editor -> Create NSManagedObject Subclass...) 创建了 NSManagedObject 子类。

NSManagedObject 子类是在objective-c 中创建的,我将.h 文件添加到桥接头。

我在项目的其余部分中使用 NSManagedObject 子类没有问题。我什至可以在同一个 Struct 中创建该类型的属性,如下所示:

struct MyListView: View {

    var test : MyNSManagedObjectSubclass //Xcode does recognize it here

由于某种原因,Xcode 无法识别 ForEach 循环内的 NSManagedObject 子类。

代码如下:

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 还是很陌生。感谢你的帮助。

标签: objective-cswiftswiftuinsmanagedobjectswift5.2

解决方案


好的,在退后一步并简单地从头开始重新编码后,它就可以正常工作,不需要铸造......

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

我认为铸造不起作用的假设是不正确的。我可能检查result.property == false了 ,property类型NSNumber,它给出了一些奇怪的编译错误,导致我走错了路。


推荐阅读