Swift:返回 self 类型的数组 [英] Swift: return Array of type self
问题描述
我想写一个类函数,它会返回一个类类型的数组.据我所知,我可以使用 Self
作为 objective-c instanceType
.我的目标是使用 fetchObjects
方法为 NSManagedObject
创建一个 extension
.此方法将返回 NSManagedObject
子类的数组.这是我无法编译的伪代码示例:
I would like to write a class function, which will return an array of the class type. As far as I understood, I can use Self
for the objective-c instanceType
. My goal is to create an extension
for a NSManagedObject
with a fetchObjects
method. This method will than return an array of NSManagedObject
subclasses. Here is a example of my pseudo code which does not compile:
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 类型的数组吗?
Any idea how i can define an array of type Self?
感谢您的帮助!
推荐答案
这是我用于类似功能的 jist,注意它是对 NSManagedObjectContext
而不是 NSManagedObject 的扩展代码>.类似的事情可能可以在
NSManagedObject
This is the jist of what I use for a similar function, note that it's an extension on NSManagedObjectContext
rather than NSManagedObject
. Something similar could probably be done on 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:
Note that you can also implement NamedManagedObject for all NSManagedObjects with:
extension NSManagedObject : NamedManagedObject {
class func entityName() -> String {
return NSStringFromClass(self)
}
}
如果您还确保所有类都明确指定了 Objective-C 友好名称:
If you also insure that all your classes are explicitly given Objective-C friendly names:
@objc(MyManagedObject)
class MyManagedObject : NSManagedObject { ... }
这篇关于Swift:返回 self 类型的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!