我想编写一个类函数,它将返回类类型的数组.据我所知,我可以使用“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
}
}
任何想法我如何定义一个类型的数组?
感谢任何帮助!
解决方法
这是我用于类似功能的jist,请注意,它是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 { ... }