我有一个ModelBase类,并从中继承了一些类(例如Task,Milestone等)。我想创建一个名为“all”的静态方法,该方法将提取所有模型(比如说一个数组),但是我希望该数组的类型为[Task]而不是[ModelBase]。尽管我不想尽可能为每个子类编写该方法。
class Task: ModelBase {
override class var tableName : String {return "Task"}
}
然后我可以做:
Task.all({ (tasks:[Task]) in
// do stuff with tasks
});
到目前为止,我一直在使用type(of:self)在非静态/类方法内部访问类级别的变量。
但是,我想有一个可以从API提取模型的静态方法,但是我不知道如何引用当前类(即本例中的Task)
请让我知道我想做的事是否可行。这是我从解析中获取的示例代码。
class ModelBase: NSObject {
// THIS WORKS FINE --->
class var tableName : String {return "ModelBase"}
init(_ _dictionary: [String: Any]) {
self.dictionary = _dictionary
_parseObject = PFObject(className: type(of: self).tableName)
}
// THIS IS WHAT FAILS -------------->
class func all(_ success: @escaping ([ModelBase]) ->(), failure: @escaping (Error) -> ()){
var models = [ModelBase]()
let questsQuery = PFQuery(className: ModelBase.tableName)
questsQuery.findObjectsInBackground {
(objects: [PFObject]?, error: Error?) -> Void in
if let error = error {
failure(error)
} else {
if let objects = objects {
for object in objects {
models.append( ModelBase(parseObject: object as PFObject))
}
success(models)
} else {
success([])
}
}
}
}
}
最佳答案
如果我理解正确,则希望此代码在ModelBase的任何子类上都是多态的。为此,我建议使用泛型。
class func all<T: ModelBase>(_ success: @escaping ([T]) ->(), failure: @escaping (Error) -> ()) {
let questsQuery = PFQuery(className: T.tableName)
questsQuery.findObjectsInBackground {
(objects: [PFObject]?, error: Error?) -> Void in
if let error = error {
failure(error)
return
}
guard let objects = objects else {
success([])
return
}
let models = objects.map(T.init(parseObject:))
success(models)
}
}