SwiftyJSON源代码学习(四)

概述

还是以{ "imageName": "Lina", "urls": ["http://www.anExample.com", "http://www.anotherExample.com"] }为例,通过上文已分析的源码,已经可以用json["urls"][0]的方式来取得第一个url,然而此时拿到的却不是http://www.anExample.com的url,而是一个JOSN结构体,我们还需要一个方式把该结构体变成实际可用的swift类型。为了使用更加方便,还需要提供字面值构造方法以及支持打印。

获取最终结果

通过前面系统文章的分析,实际的最终结果值已经被赋值给了对应的rawValue属性,被通过计算属性object进行整合。但是object类型为Any,并且还不具备开篇说的怎么玩都不会崩溃的功能。
SwiftyJSON通过增加一系列属性,包含了全部开发中可能的目标类型,让用户方便的获取想要类型的最终结果。如array arrayValue string stringValue等等,没有Value后缀的版本如string,如果不能把最终结果转化为对应的类型,将返回nil;而有Value的版本如stringValue,如果不能把最终结果转化为对应的类型,将返回""空字符串。
实现逻辑较简单,因为具体的类型和数据都已经在前面处理完成,只需要对类型进行判断,如果与属性相符返回相应的rowValue,如果不相符尝试转换或直接返回nil(如果是Value版本返回默认值)

面向协议编程(续)

上文已经使用了ComparableCollection协议把JSON结构体扩展为了swift集合类型,并通过集合类型内置的subscript特性获得了非常方便的获取复杂JSON结构体任意深度数据的方式。
本文继续分析LiteralConvertible RawRepresentable CustomStringConvertible CustomDebugStringConvertible 等协议在SwiftyJSON中的使用。

关于LiteralConvertible系列协议

实现该系列协议可以获得直接使用字面值生成实例的特性。如let str = "hello",之所以String类型可以直接使用字符串字面值"hello"来生成实例str,就是因为String类型实现了ExpressibleByStringLiteral协议。
可想而知,协议内容就是一个以指定类型为参数的构造方法。

关于RawRepresentable协议

RawRepresentable协议提供的是原类型实例与协议中rawValue类型实例的相互转化能力,一般用在枚举类型。SwiftyJSON中主要通过以rawValue为基础扩展rawDatarawString来实现JSON结构体序列化为Data String等类型。
协议内容为一个以rawValue为参数的构造方法和一个rawValue属性

关于CustomStringConvertibleCustomDebugStringConvertible 协议

实现该协议可以在控制台把实例的有用信息打印出来,协议内容是一个description的字符串类型属性

你可能感兴趣的:(SwiftyJSON源代码学习(四))