我有一个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)
    }
}

08-25 08:35