OGeek|极客世界-中国程序员成长平台

标题: ios - 如何在 Swift 3 的基类中实例化一个对象 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:03
标题: ios - 如何在 Swift 3 的基类中实例化一个对象

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

}



Best Answer-推荐答案


如果我理解正确,您希望此代码在 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|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4