Swift:返回self类型的数组

时间:2014-07-02 17:18:32

标签: ios arrays types swift

我想编写一个类函数,它将返回类类型的数组。据我所知,我可以使用“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类型的数组吗?

感谢您的帮助!

1 个答案:

答案 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 { ... }