我有一个 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)
}
}
关于ios - 如何在 Swift 3 的基类中实例化一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40598506/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) | Powered by Discuz! X3.4 |