传递常规NSFetchRequest方法的参数

问题描述

我需要为项目中的许多视图创建通用方法,以将数据导出为.csv。为此,我需要传递一个“实体”参数,以便对所有这些对象重用此功能

“ Alumno”实体的示例代码如下:

func exportData(???) {
    
    let container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
   
    //*
    var exportData: [Alumno] = []
    let exportRequest: NSFetchRequest<Alumno> = Alumno.fetchRequest()
    //*
    
    let context = container?.viewContext
    
    do {
        exportData = try context!.fetch(exportRequest)
    } catch {
        print("Error: \(error)")
    }
    ...

现在,如何重用此方法定义中的“实体”参数(标记为???)以及“ exportData”数组和“ exportRequest”定义(标记为*),以便重用此参数从其他视图调用以导出其数据的方法

谢谢。

解决方法

如果您希望此方法适用于您的任何实体,则无需知道其正在使用哪个实体。它可以使用NSManagedObject,而忽略子类。

这就像

func exportData(class name: String) -> Void {
    // ...

    var exportData: [NSManagedObject] = []
    let exportRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: name)

    // ...
}

名称是获取请求所需的全部。您将获得托管对象的集合。

,

继续执行Tom的建议,他是对的:我定义了三个csv()方法来为我的每个实体获取csv字符串。例如,“ alumno”之一:

extension Alumno {

func csv() -> String {
    let coalescedNombre = nombre ?? ""
    let coalescedEspecialidad = especialidadRelacionada?.nombre ?? ""
    let coalescedCurso = cursoRelacionado?.nivel ?? ""
    let coalescedTutor = tutorRelacionado?.nombre ?? ""
    let coalescedMovil = movil ?? ""
    let coalescedCorreo = correo ?? ""
    let formatter = DateFormatter()
    formatter.dateFormat = "d MMM y,E HH:mm"
    let coalescedNacimiento = formatter.string(from: nacimiento!)
    return "\(coalescedNombre),\(coalescedEspecialidad),\(coalescedCurso),\(coalescedTutor),\(coalescedMovil),\(coalescedCorreo),\(coalescedNacimiento)\r\n"
}

}

但是现在的问题是:如何匹配此合并的值以为其对应实体填充csv文件?我的意思是:我可以为所有这些方法编写等效的方法,但是,如何定义其值?这不起作用:

extension NSManagedObject {

func csv() -> String {

    var entity = NSManagedObject.entity
    
    if entity == Alumno {
        let coalescedNombre = nombre ?? ""
        let coalescedEspecialidad = especialidadRelacionada?.nombre ?? ""
        let coalescedCurso = cursoRelacionado?.nivel ?? ""
        let coalescedTutor = tutorRelacionado?.nombre ?? ""
        let coalescedMovil = movil ?? ""
        let coalescedCorreo = correo ?? ""
        let formatter = DateFormatter()
        formatter.dateFormat = "d MMM y,E HH:mm"
        let coalescedNacimiento = formatter.string(from: nacimiento!)
        return "\(coalescedNombre),\(coalescedNacimiento)\r\n"

    }

   if entity == ... 

}

}