Swift:返回 self 类型的数组

Posted

技术标签:

【中文标题】Swift:返回 self 类型的数组【英文标题】:Swift: return Array of type 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?还是当前的类类型? 【参考方案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”的东西也是我所寻找的。实际上想和你一样先;)

以上是关于Swift:返回 self 类型的数组的主要内容,如果未能解决你的问题,请参考以下文章

Swift 对数组进行排序并返回索引和元素的数组

在for循环中将PFFile数组转换为UIImage返回空数组Swift

求助关于 swift 数组,NSArray 和 闭包 的问题

在iOS9 swift中的字典类型中添加数组作为键和值

简单的 Swift 数组扩展

在 swift 中使用协议作为数组类型和函数参数