You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断NavigationPath中是否包含NSManagedObject类型对象?

解决NavigationPath判断包含Core Data对象的问题

因为NavigationPath本身没有提供contains()方法,且它存储的是类型擦除后的AnyHashable元素,结合你使用的是Core Data的NSManagedObject子类Item,可以通过以下两种方式实现需求:

方法一:扩展NavigationPath,添加Item专属判断方法

利用Item的objectID(Core Data对象的唯一标识)做匹配,即使对象因Core Data的fault机制生成不同实例,也能准确判断是否在路径中:

extension NavigationPath {
    func containsItem(_ targetItem: Item) -> Bool {
        return self.elements.contains { element in
            guard let item = element as? Item else {
                return false
            }
            return item.objectID == targetItem.objectID
        }
    }
}

在视图中直接调用该方法即可:

NavigationLink(value: item) {
    Text("Item at \(item.timestamp!.formatted())")
}
.disabled(navigation.path.containsItem(item))

方法二:在Navigation类中维护Item的ID集合

如果需要更灵活的扩展(比如后续支持多种路径元素类型),可以在Navigation类中额外维护一个存储Item的objectID的集合,保持和path状态同步:

final class Navigation: ObservableObject {
    @Published var path = NavigationPath()
    private(set) var includedItemIDs = Set<NSManagedObjectID>()
    
    // 同步更新路径和ID集合的方法
    func pushItem(_ item: Item) {
        path.append(item)
        includedItemIDs.insert(item.objectID)
    }
    
    func popItem() {
        guard let lastElement = path.last as? Item else {
            path.removeLast()
            return
        }
        path.removeLast()
        includedItemIDs.remove(lastElement.objectID)
    }
    
    func popToRoot() {
        path.removeLast(path.count)
        includedItemIDs.removeAll()
    }
}

使用时直接判断集合中是否包含当前Item的ID:

.disabled(navigation.includedItemIDs.contains(item.objectID))

注意:第二种方法需要确保includedItemIDs和path的状态始终同步,所有修改path的操作都要对应更新集合。

内容的提问来源于stack exchange,提问作者parapote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:55:19