首页 > 解决方案 > 按“isComplete”过滤数组

问题描述

我有两个数据集“ProjectItem”和“TaskItem”,一个项目可以有很多任务。我想在他们所属的项目中通过“isComplete”过滤任务。

在我的 ProjectItem+CoreDataProperties 文件中,我有以下内容:

extension ProjectItem {

    @NSManaged public var projectColor: String
    @NSManaged public var projectId: UUID
    @NSManaged public var projectTitle: String
    @NSManaged public var projectDateCreated: Date
    @NSManaged public var isFavorite: Bool
    @NSManaged public var task: NSSet
    
    public var taskArray: [TaskItem] {
        let set = task as? Set<TaskItem> ?? []
        -- How can I filter for "isComplete" here? -- 
    }
}

TaskItem+CoreDataProperties 看起来像这样:

extension TaskItem {

    @NSManaged public var completedDate: Date
    @NSManaged public var completeIcon: String
    @NSManaged public var createdDate: Date
    @NSManaged public var dueDate: Date
    @NSManaged public var id: UUID
    @NSManaged public var isComplete: Bool
    @NSManaged public var notes: String
    @NSManaged public var priority: String
    @NSManaged public var title: String
    @NSManaged public var project: ProjectItem?
}

如何修改第一个代码片段中的数组以仅显示“isComplete”= true 的任务?

非常感谢!

标签: iosswiftswiftui

解决方案


您不再需要使用动态定义 Coredata 托管属性NSSet。您也可以使用具有Element类型的泛型集,并且核心数据能够从底层存储中推断出类型。所以,你的班级可以改成这样,

extension ProjectItem {

    @NSManaged public var projectColor: String
    @NSManaged public var projectId: UUID
    @NSManaged public var projectTitle: String
    @NSManaged public var projectDateCreated: Date
    @NSManaged public var isFavorite: Bool
    // Notice this 
    @NSManaged public var task: Set<TaskItem>   
}

因此,对于已完成的任务项目,您可以根据需要简单地使用过滤器Set

extension ProjectItem {

  var completedItems: Set<TaskItem> {
    return task.filter(\.isComplete)  // for 5.2 and above
  }

}

推荐阅读