• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 如何在 Swift 3 的基类中实例化一个对象

[复制链接]
菜鸟教程小白 发表于 2022-12-11 18:03:33 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap