如何在 Siesta 中定义内容转换器?

How to define content transformers in Siesta?

我正在集成 Siesta,我喜欢它,它解决了我们在使用 RestKit 等框架时遇到的很多问题。

我无法理解的是如何使用内容转换器?我查看了文档和示例,但我不太明白它是如何工作的,我对 Swift.

也很陌生

看这个例子取自另一个 SO 回复:

private let SwiftyJSONTransformer = ResponseContentTransformer(skipWhenEntityMatchesOutputType: false) {
    JSON([=10=].content as AnyObject)
}

我不太明白这里发生了什么,没有 return 值,所以我不明白内容是如何转换的。这可能是我缺乏深入的 Swift 知识所致。

我了解 NSValueTransformer 对象在 Obj-C 中的工作方式,但我不知道如何映射响应 abit JSON 或只是一个简单的响应主体,如单个字符串,使用 Siesta 的对象或类型的布尔值数量。

我们有一些 API 响应 return 只是响应主体中的单个 BOOL 值,而大多数其他 API 响应是复杂的 JSON 对象图。

我将如何将这些响应映射到更原始的类型和/或更复杂的对象。

谢谢。

您的一些困惑是基本的 Swift 内容。在闭包使用 [=11=] 且仅包含单个语句的情况下,将推断输入类型并且 return 是隐式的。因此,您问题中的代码等效于:

ResponseContentTransformer(skipWhenEntityMatchesOutputType: false) {
  (content: AnyObject, entity: Entity) in
  return JSON(content)
}

(使用 [=13=].content 而不是 [=11=] 是 Swift 中可能存在错误的功能的解决方法,其中 [=11=] 成为所有参数的元组而不仅仅是第一个。不要太担心它;[=13=].content 只是您可以在午睡变形金刚中使用的魔法咒语。)

你困惑的另一半是午睡本身。一般做法如下:

  1. 配置一个通用转换器,将原始 NSData 转换为解码但未结构化的类型,例如 StringDictionary
  2. 可选择配置第二个转换器,将非结构化类型转换为模型。
    • 您通常会根据 API 路径进行配置。
    • Siesta 默认不包含任何这些;都是每个应用程序。

对于纯布尔值的响应,您可能只会执行 #1 — 具体取决于服务器发送的响应类型,以及您如何知道它只是一个布尔值。

我建议查看该代码中的 example project included with Siesta, which gives a good example of how all this plays out. You’ll see examples of both transformers that conditionally operate on the content based on its type (#1) and model-specific tranformers (#2)