问题描述
我需要为项目中的许多视图创建通用方法,以将数据导出为.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 == ...
}
}