Using Identifiable set of objects in List View in SwiftUI

Viewed 417

I have a DataBase handled by DataCore. I am trying to retrieve any object of "assignment" and insert it to a View List. The assignment class itself is identifiable but I am getting an error while trying to create the List in the View :

Initializer 'init(_:id:rowContent:)' requires that 'Set<NSManagedObject>' conform to 'RandomAccessCollection'

Is the set itself is not identifiable even though the objects are identifiable ? How can I present all the objects in the set inside the View's list ?

The view:

import SwiftUI

struct AssignmentList: View {
    
  
     @ObservedObject var assignmentViewModel = assignmentViewModel()
    
    var body: some View {
        
        
        VStack {

     
                NavigationView {
                    
                    //**The error is in the following line : **
                    List(assignmentViewModel.allAssignments, id: \.self) { assignment in
                     
                        AssignmentRow(assignmentName: assignment.assignmentName,  notes: assignment.notes) //This view works by itself and just present the data as text under HStack
                         
                     }
                  .navigationBarTitle(Text("Assignments"))
             }
            
             Button(action: {
                    
            
                                 self.assignmentViewModel.retrieveAllAssignments()
                             
                                              
                           }) {
                                                         
                                     Text("Retrieve")
                              }
        }
      
        
    }
}

This is the assignment class:

import Foundation
import CoreData


extension Assignment: Identifiable {

@nonobjc public class func fetchRequest() -> NSFetchRequest<Assignment> {
    return NSFetchRequest<Assignment>(entityName: "Assignment")
}

@NSManaged public var id: UUID?
@NSManaged public var assignmentName: String?
@NSManaged public var notes: String?


}

This is the ViewModel that connects to the view using binding:

class AssignmentViewModel : ObservableObject
{



 private var assignmentModel = AssignmentModel() 

/*AssignmentModel is a different class, we assume all methods working correctly and it's not a part of the question.*/



@Published var allAssignments : Set<Assignment>



 init()
 {
        allAssignments=[]

 }


func retrieveAllAssignment()
{
    
    allAssignments=assignmentModel.retrieveAllAssignments()
    
}

}
1 Answers

Try the following

List(Array(assignmentViewModel.allAssignments), id: \.self) { assignment in

                 
Related