Swift:返回self类型的数组



我想写一个类函数,它将返回一个类类型的数组。据我所知,我可以用Self代替objective-c instanceType。我的目标是用fetchObjects方法为NSManagedObject创建extension。这个方法将返回一个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
    }
}

任何想法如何我可以定义一个数组类型的自我?

谢谢你的帮助!

这是我对类似函数使用的列表,请注意它是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 { ... }

最新更新