想法是使用 Coredata 获取“类型化”数据。
已更新
class func retrieve<T: AnyObject>(entityName:T.Type, sortBy:String? = nil, isAscending:Bool? = true, predicate:NSPredicate? = nil) -> AnyObject[] {
println("\(entityName)")
let request = NSFetchRequest(entityName: "Users")
request.returnsObjectsAsFaults = false
if predicate != nil {
request.predicate = predicate
}
if (sortBy != nil){
var sorter: NSSortDescriptor = NSSortDescriptor(key: sortBy , ascending: isAscending!)
request.sortDescriptors = [sorter]
}
var error: NSError? = nil
var fetchedResult = myDataModel.managedObjectContext.executeFetchRequest(request, error: &error)
if !error {
println("errore: \(error)")
}
println("retrieved \(fetchedResult.count) elements for \(entityName)")
return fetchedResult
}
现在,我上面写的在语法上是正确的,但我相信还有另一种方法可以实现相同的效果,也许更“容易”。我认为这个建议很明确:) 我试图从 entityName 输入参数
获取类名以下面的方式或类似的方式调用此函数:
var xx = myDataModel.retrieve(Users.self)
哪里
Users: NSManagedeObject
你有什么建议吗?
最佳答案
如果,正如 @David 指出的,您将 @objc(ModelClassName)
添加到您的 Model 类中,这是一个简化版本:
func retrieve<T: NSManagedObject>(entityClass:T.Type, sortBy:String? = nil, isAscending:Bool = true, predicate:NSPredicate? = nil) -> T[] {
let entityName = NSStringFromClass(entityClass)
let request = NSFetchRequest(entityName: entityName)
request.returnsObjectsAsFaults = false
request.predicate = predicate
if (sortBy != nil) {
var sorter = NSSortDescriptor(key:sortBy , ascending:isAscending)
request.sortDescriptors = [sorter]
}
var error: NSError? = nil
var fetchedResult = myDataModel.managedObjectContext.executeFetchRequest(request, error: &error)
if !error {
println("errore: \(error)")
}
println("retrieved \(fetchedResult.count) elements for \(entityName)")
return fetchedResult
}
人们会这样使用它:
@objc(Client)
class Client : NSManagedObject {
...
}
retrieve(Client) // This would get all clients in the database.
关于generics - Swift - 使用泛型获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393837/