从不同核心数据实体获取数据并将结果转换为相应类的通用方法

Anu*_*yal 1 casting core-data nsmanagedobject ios swift

我正在写一个通用的方法与给定的从核心数据实体获取数据entityNamepredicatesortDescriptors。我想将结果作为请求实体的数组返回。如果我给Student作为entityName,则需要返回如下所示的学生数组,

do {
        if let results = try CoreDataController.sharedInstance.masterManagedObjectContext.fetch(request) as? [Student] {

            if results.count > 0 {

                return results
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里的问题是,在使用给定实体名称的通用方法中,如何将结果转换为相应实体类的数组?

我试图从实体名称生成类,

let coreDataClass = NSClassFromString(entityName) as! NSManagedObject.Type
Run Code Online (Sandbox Code Playgroud)

但这不在数组声明中(在以上代码中的Student中)。请帮助我找到正确的方法。

提前致谢!

vir*_*ral 5

您可以将Swift Generics用于完全相同的场景。

考虑下面的Swift(版本3.0.1)代码,该代码用于获取带有谓词和排序描述符作为参数的对象数组(您可以在coredata helper类中将该函数定义为类方法):

class func arrayOf<T: NSManagedObject>(_ entity: T.Type, 
                                       predicate: NSPredicate? = nil,
                                       sortDescriptor: [NSSortDescriptor]? = nil,
                                       context: NSManagedObjectContext = CoreDataHelper.shared.context()) -> NSMutableArray? {

    let fetchRequest = NSFetchRequest<T>(entityName: NSStringFromClass(T.self))

    if predicate != nil {
        fetchRequest.predicate = predicate!
    }

    if sortDescriptor != nil {
        fetchRequest.sortDescriptors = sortDescriptor!
    }

    fetchRequest.returnsObjectsAsFaults = false

    do {

        let searchResult = try context.fetch(fetchRequest)
        if searchResult.count > 0 {
            // returns mutable copy of result array
            return NSMutableArray.init(array: searchResult)
        } else {
            // returns nil in case no object found
            return nil
        }

    } catch {
        print(error.localizedDescription)
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能有所帮助。