我想编写一个类函数,它将返回类类型的数组。据我所知,我可以使用“Self”作为objective-c“instanceType”。我的目标是使用fetchObjects方法为NSManagedObject创建扩展。此方法将返回NSManagedObject子类的数组。这是我的伪代码的一个例子,它不能编译:
extension NSManagedObject {
class func fetchObjects(entity: String, context: NSManagedObjectContext, predicate: NSPredicate?, sortDescriptors: NSSortDescriptor[]?) -> Self[] {
// can't define return type of an array with type Self
// also var declaration does not work
var objects : Self[]?
return objects
}
}
我知道如何定义Self类型的数组吗?
感谢您的帮助!
答案 0 :(得分:9)
这是我用于类似功能的要点,请注意它是NSManagedObjectContext
而不是NSManagedObject
的扩展名。可能会在NSManagedObject
protocol NamedManagedObject {
class func entityName() -> String;
}
extension NSManagedObjectContext {
func fetchObjects<T:NSManagedObject where T:NamedManagedObject>(entity:T.Type, predicate:NSPredicate? = nil, sortDescriptors:NSSortDescriptor[]? = nil) -> T[]? {
let request = NSFetchRequest(entityName: entity.entityName())
request.predicate = predicate
request.sortDescriptors = sortDescriptors
var error:NSError? = nil
let results = self.executeFetchRequest(request, error: &error) as? T[]
assert(error == nil)
return results
}
}
extension MyObjectClass : NamedManagedObject {
class func entityName() -> String {
return "MyObjectClass"
}
}
然后使用它就像:
let objects = managedObjectContext.fetchObjects(MyObjectClass)
请注意,您还可以使用以下命令为所有NSManagedObject实现NamedManagedObject:
extension NSManagedObject : NamedManagedObject {
class func entityName() -> String {
return NSStringFromClass(self)
}
}
如果您还确保所有课程都明确给出了Objective-C友好名称:
@objc(MyManagedObject)
class MyManagedObject : NSManagedObject { ... }