我想编写一个类函数,它将返回类类型的数组.据我所知,我可以使用“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
- }
- }
任何想法我如何定义一个类型的数组?
感谢任何帮助!
解决方法
这是我用于类似功能的jist,请注意,它是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)
请注意,您还可以为所有NSManagedObjects实现NamedManagedObject:
- extension NSManagedObject : NamedManagedObject {
- class func entityName() -> String {
- return NSStringFromClass(self)
- }
- }
如果你也确保所有的类都明确地给出了Objective-C友好的名字:
- @objc(MyManagedObject)
- class MyManagedObject : NSManagedObject { ... }