【问题标题】:Swift: return Array of type selfSwift:返回 self 类型的数组
【发布时间】:2014-08-23 14:32:02
【问题描述】:

我想写一个类函数,它会返回一个类类型的数组。据我了解,我可以将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
    }
}

知道如何定义 Self 类型的数组吗?

感谢您的帮助!

【问题讨论】:

  • 你可以像这样参数化函数:class fund fetchObjects<Self>(...) -> Self[]? 但我认为你不能泛化从 ObjC 到 Swift 的桥接,这样编译器就可以保证对于每个 NSManagedObject 都会有对应的 Swift 对象。不过那会很棒,很好的问题。
  • 为了清楚起见,您不是在寻找“子类”数组,而是在寻找类型为已命名超类的子类的实例数组?
  • 是的,这就是我想要实现的,所以如果我在 NSManagedObject 子类上调用它,它将返回该子类的实例数组
  • 但是如果我声明 ,它不是用作泛型吗,好像我会写 class fund fetchObjects?还是当前的类类型?

标签: ios arrays types swift


【解决方案1】:

这是我用于类似功能的要点,注意它是NSManagedObjectContext 的扩展,而不是NSManagedObjectNSManagedObject 上可能会做类似的事情

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

【讨论】:

  • 太棒了! “.Type”的东西也是我所寻找的。实际上想和你一样先;)
猜你喜欢
  • 1970-01-01
  • 2020-11-23
  • 2017-12-01
  • 2014-09-03
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多