编码-序列化变得容易

随着Swift 4和iOS 11的到来,以及XCode 9 GM准备将应用程序发送到AppStore,我们必须为可用的最新技术做好准备,以为用户带来最佳体验。 我们实现这一目标的方法之一是使产品更易于编码,阅读和维护。 这也可能导致更快的创建过程和对社区的更快反应。 今天,我想写一件事,您可以做一些接近最终效率的事情-可编码协议。

我非常相信,如果您在这里,您可能对序列化和JSON 有所了解。 尽管人们可以花大量时间来解释什么是Codable以及它如何工作,但我将专注于一件可能不那么容易处理的事情-具有相关价值的枚举。 假设我们要给非iPhone-X用户一个发送动画表情符号的机会。 我们需要处理枚举“ Animojis”,其中要考虑到iPhone X发送的真实动画和普通表情符号,用户希望我们将它们与我们的高端技术动画化,其唯一目的是模拟卡通图标的运动。

很基本吧? 编写自定义解析器应该是一件容易的事,但是……嘿! 使用Swift 4和iOS 11,我们不想这样做! 让我们先关注编码。 为此,我们必须提供一个Encodable结构,该结构将保留枚举实例的关联值。 让我们从非iPhone-X手机壳开始。

现在我们可以实现Encodable协议并使用可用的编码功能,因为该结构的所有属性都是开箱即用的Codable协议支持的类型。

现在,您可以使用Apple的JSONEncoder创建漂亮的 JSON! 让我们尝试一下。

如果我们打印json变量,我们可以看到:

没有明确指示这实际上是什么情况,因此我们必须花很多精力来解码JSON,尤其是对于更多的中间场景。 必须应用一些修复程序。

让我们来看看json变量下的内容。

这样更好 构造我们想要的数据非常容易,并且不需要涉及任何键或解析。 但是解码呢? JSON已准备好共享,因此我们也应包括解码。 为此,我们必须使Animoji枚举符合Decodable协议,并且由于它已经符合Encodable,因此我们可以简单地用Codable替换它,并从Decodable协议中添加缺少的init并修改结构。 这是更改的结果。

现在,让我们尝试对通过编码创建的数据变量进行解码。

在XCode Playgrounds中,我们可以看到在result变量下有我们心爱的:poop:emoji表情。 成功!

我希望本快速阅读为如何处理Codable协议提供一些启示。 还有其他一些方法可以解决此问题,例如实现CodingKeys或手动从解码器容器中提取值,但引起我注意的是本文中介绍的处理这种情况的方式。 如果您根本不熟悉Codable协议,建议您遵循此综合指南。 我希望您发现它有些用处/有趣,不要犹豫分享它或在下面的评论中留下反馈/问题。