概述
还是以{ "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
版本返回默认值)
面向协议编程(续)
上文已经使用了Comparable
和Collection
协议把JSON结构体扩展为了swift集合类型,并通过集合类型内置的subscript
特性获得了非常方便的获取复杂JSON结构体任意深度数据的方式。
本文继续分析LiteralConvertible
RawRepresentable
CustomStringConvertible
CustomDebugStringConvertible
等协议在SwiftyJSON中的使用。
关于LiteralConvertible
系列协议
实现该系列协议可以获得直接使用字面值生成实例的特性。如let str = "hello"
,之所以String
类型可以直接使用字符串字面值"hello"
来生成实例str
,就是因为String
类型实现了ExpressibleByStringLiteral
协议。
可想而知,协议内容就是一个以指定类型为参数的构造方法。
关于RawRepresentable
协议
RawRepresentable
协议提供的是原类型实例与协议中rawValue
类型实例的相互转化能力,一般用在枚举类型。SwiftyJSON中主要通过以rawValue
为基础扩展rawData
和rawString
来实现JSON结构体序列化为Data
String
等类型。
协议内容为一个以rawValue
为参数的构造方法和一个rawValue
属性
关于CustomStringConvertible
和CustomDebugStringConvertible
协议
实现该协议可以在控制台把实例的有用信息打印出来,协议内容是一个description
的字符串类型属性