我想使用 ResponseTransformer(或其中的一系列)自动将我的对象模型类映射到从 Siesta 服务返回的响应,以便我的 Siesta 资源是我的模型类的实例。我有一个类的工作实现,但我想知道在为每种类型的资源(模型)构建单独的 ResponseTransformer 之前是否有更安全、更智能或更有效的方法来做到这一点。
这是一个示例模型类:
import SwiftyJSON
class Challenge {
var id:String?
var name:String?
init(fromDictionary:JSON) {
if let challengeId = fromDictionary["id"].int {
self.id = String(challengeId)
}
self.name = fromDictionary["name"].string
}
}
extension Challenge {
class func parseChallengeList(fromJSON:JSON) -> [Challenge] {
var list = [Challenge]()
switch fromJSON.type {
case .Array:
for itemDictionary in fromJSON.array! {
let item = Challenge(fromDictionary: itemDictionary)
list.append(item)
}
case .Dictionary:
list.append(Challenge(fromDictionary: fromJSON))
default: break
}
return list
}
}
这是我构建的 ResponseTransformer,用于映射来自任何端点的响应,该端点返回此模型类型的集合或此模型类型的单个实例:
public func ChallengeListTransformer(transformErrors: Bool = true) -> ResponseTransformer {
return ResponseContentTransformer(transformErrors: transformErrors)
{
(content: NSJSONConvertible, entity: Entity) throws -> [Challenge] in
let itemJSON = JSON(content)
return Challenge.parseChallengeList(itemJSON)
}
}
最后,这是我在配置 Siesta 服务时所做的 URL 模式映射:
class _GFSFAPI: Service {
...
configure("/Challenge/*") { $0.config.responseTransformers.add(ChallengeListTransformer()) }
}
我计划为每种模型类型构建一个单独的 ResponseTransformer,然后将每个 URL 模式单独映射到该转换器。这是最好的方法吗?顺便说一句,我对新的 Siesta 框架感到非常兴奋。我喜欢面向资源的 REST 网络库的想法。