Swift泛型函数返回新对象

时间:2015-05-23 21:06:35

标签: json swift generics

我正在尝试创建一个返回通过REST API JSON响应获得的对象的泛型函数。我想为类型提供泛型,让它提交请求/解析JSON,并返回提供类型的对象列表(例如Item)。我有获得JSON响应的部分,但使用泛型对我来说是新的。这是一个让我感到困惑的伪代码:

class Model {
    func setPropertiesFromJSON(data: NSData) { 
        // Lookup property names of object and set from JSON fields.
    }
}
class Item : Model {
    var a
    var b
}

class RestEndpoint {
    func getModels<T>() -> [T] {
        let data: NSData = ... // Submit GET request and receive JSON data.
        var models = [T]()
        for objectData in data {
            // How to create newobj as T (subtype of Model), set its properties, 
            // and add it to models array?
            // let newobj: T as? TrackminiModel = T()
            // newobj.setPropertiesFromJSON(objectData)
            // models.append(newobj)
        }
        return models
    }
}

let restEndpoint = RestEndPoint()
var items: [Item] = restEndpoint.getModels<Item>()

注释掉的代码非常不正确,但这就是目标。有关如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:2)

从您的问题来看,这听起来像您感兴趣的是一个相当普遍的需求。使用Restful API与后端服务器通信的能力。您可以继续沿着您似乎正在创建大量代码的路径来完成此任务,并且此答案不会在该方向上提供太多帮助。

但是,我想指出两个开源库ObjectMapper,我认为这些库可以解决您的问题。这是ObjectMapper的简要描述(来自其github页面)。

  

ObjectMapper是一个用Swift编写的框架,可以轻松实现   您可以将Model对象(Classes和Structs)转换为   JSON。

第二个项目是AlamofireObjectMapper,我认为最终可能正是您正在寻找的。以下是该项目githup页面的简要说明。

  

Alamofire的扩展,可自动转换JSON响应   使用ObjectMapper将数据转换为swift对象。

所有这些都建立在Alamofire之上,它处理与Restful API进行通信的所有细节。

这里再次简要介绍Alamofire。

Alamofire是一个用Swift编写的HTTP网络库。

  • 可链接请求/响应方法
  • URL / JSON / plist参数编码
  • 上传文件/数据/流
  • 使用请求或恢复数据下载
  • 使用NSURLCredential进行身份验证
  • HTTP响应验证
  • 进展关闭&amp; NSProgress
  • cURL调试输出
  • 综合单元测试覆盖率
  • 完整文档

你可能觉得拿起其他图书馆来完成一些任务就是&#34;作弊&#34;你有机会自己学习如何做某事,但制作应用程序仍然存在很多挑战。有人会说没有利用这些开源库是无差别的重举#34;