具有可腐烂性的漂亮自构物体

这是一个分为四部分的系列文章的第三篇,该文章名为: Nifty,Swifty,API支持的App 您可以在 此处 分叉最终项目

第1部分:具有GitHub Pages的Nifty静态内容托管

第2部分:带有枚举的Nifty Bug-Safe URL

第4部分:带有NSCache的漂亮的自动缓存ImageView

介绍

在上一篇文章中,我们使用错误安全的网址获取了json数据。 现在,我们想使用该数据为我们的项目创建Person对象。

我曾经使用JSONSerialization来执行此类任务,它将根据输入的json数据生成一个字典。 构造所需的对象将需要遍历字典中的每个键,将值向下转换为所需的类型,然后将其分配给对象中的适当属性。 这很费力,并且容易出错,因为您必须键入每个键。

幸运的是,这现在是从json实现对象创建任务的“老方法”,并且现在有了Decodable协议,它非常安全且易于实现。

用可解码初始化对象

让我们从以下位置的json开始:https://timmybea.github.io/StaticHostingDemo/objectData.json

您会注意到,我们有一个键“ person”,其中包含一个数组json对象,这些数组包含我们的人员数据。 因此,让我们由内而外地进行工作,并从构造我们的Person对象开始:

我们的对象仅对json中的每个人信息都有一个属性。 现在我们可以遵循Decodable ,为我们的解码器创建密钥并设置我们的init方法。

在此代码中,我们遵循Decodable (第1行)的要求 ,并为我们的编码键(第9-15 行)创建一个枚举 请注意,枚举类型必须为String并符合CodingKey协议。 对于每种情况,我们都分配与json键匹配的原始值。 接下来,我们实现协议初始化程序init(来自解码器:) (第17–27行)。 这涉及到使用.container(keyedBy 🙂 (第18行)将保存我们数据的解码器转换为KeyedDecodingContainer ,然后使用.decode(type :, forKey :)将每个键处的数据解码为所需的数据类型。 这些方法中的每一个都是失败的,因此初始化器被标记为throws,并在后台处理。 最后,我们调用成员明智的初始化程序,以使用成功向下转换的类型(第26行)构造我们的实例。

重要的是要确认,如果您的属性名称与json键的属性名称匹配,则只需要创建一个匹配的CodingKey即可快速神奇地构造您的实例,而无需定义初始化程序。 由于json通常不会采用这种方便的格式,因此此演示演示了完整的构建过程。

解析JSON

我们已经处理了Person实例的创建,但是请记住,所有person数据都可以通过json键“ person”访问 。 那么我们如何解析json来检索对象呢? 答案很简单:与上一节完全相同。

请注意,这一次我们只有一个[Person]类型的属性。 我们遵循与上一个示例完全相同的步骤,遵循Decodable ,创建我们的CodingKey并实现我们的init(from解码器:) 。 这里有趣的部分是我们可以使用新方法.decodeIfPresent(type:forKey 🙂 (第14行) 。 这很方便,因为我们可能有一个带有多个键的json,并且我们可以指示解码器执行检查: 如果键是.person的原始值, 解码为指定的类型。 因为我们已经为Person实现了解码器逻辑,所以我们可以将类型指定为[Person] .self (第14行)

将所有内容放到自建对象中

因此,现在我们可以向Person实体添加更多逻辑,并最终将所有实例存储在一个方便的位置:

所有人员实例均静态存储在personData中 ,这使其可以全局访问(第3行) 。 我们的方法getPeople(from json 🙂可以使用所有良好的Decoder逻辑。 我们第一次使用decode(from 🙂 ,它返回我们在上一节(第7行)中创建的JSONContainer类型。 这使我们能够访问属性.people ,您将记住它是我们的人员实例数组,并将其分配给我们的personData属性(第8行)

为了测试对象是否确实正确创建,我们可以添加一个简单的描述…

…然后将数据放入…

包起来

Decodable是一种从json构建模型对象的绝佳方法。 它只需要很少的步骤,就可以安全地处理任何故障情况。 使用.decodeIfPresent(type :, forKey 🙂还可以确保正确处理json中的所有可选键,以便您仍可以根据需要使用默认值创建对象。

请单击此处阅读第4部分: 使用NSCache的Nifty Self-Caching ImageView ,我们将在person实例中使用图像端点来下载和缓存我们项目的图像。 谢谢阅读!