Отфильтровать массив по "isComplete" - PullRequest
0 голосов
/ 13 июля 2020

У меня есть два набора данных «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?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Оптимальнее создать явный запрос на выборку и позволить CoreData фильтровать isCompleted задачи по предикату, например

struct TaskView: View {

    var tasksRequest : FetchRequest<TaskItem>
    var tasks : FetchedResults<TaskItem>{tasksRequest.wrappedValue}

    init(){
        self.tasksRequest = FetchRequest(entity: TaskItem.entity(), sortDescriptors: [], 
            predicate: NSPredicate(format: "isComplete == YES"))
    }

    // ... other code
1 голос
/ 13 июля 2020

Вам больше не нужно определять управляемое свойство Coredata с помощью Dynami c NSSet. Вы также можете использовать generi c с типом Element, а данные Core могут определить тип из базового хранилища. Итак, ваш класс может быть изменен на что-то вроде этого:

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
  }

}
...