概述
還是以{ "imageName": "Lina", "urls": ["http://www.anExample.com", "http://www.anotherExample.com"] }為例,通過上文已分析的源碼,已經(jīng)可以用json["urls"][0]的方式來取得第一個url,然而此時拿到的卻不是http://www.anExample.com的url,而是一個JOSN結(jié)構(gòu)體,我們還需要一個方式把該結(jié)構(gòu)體變成實際可用的swift類型。為了使用更加方便,還需要提供字面值構(gòu)造方法以及支持打印。
獲取最終結(jié)果
通過前面系統(tǒng)文章的分析,實際的最終結(jié)果值已經(jīng)被賦值給了對應的rawValue屬性,被通過計算屬性object進行整合。但是object類型為Any,并且還不具備開篇說的怎么玩都不會崩潰的功能。
SwiftyJSON通過增加一系列屬性,包含了全部開發(fā)中可能的目標類型,讓用戶方便的獲取想要類型的最終結(jié)果。如array arrayValue string stringValue等等,沒有Value后綴的版本如string,如果不能把最終結(jié)果轉(zhuǎn)化為對應的類型,將返回nil;而有Value的版本如stringValue,如果不能把最終結(jié)果轉(zhuǎn)化為對應的類型,將返回""空字符串。
實現(xiàn)邏輯較簡單,因為具體的類型和數(shù)據(jù)都已經(jīng)在前面處理完成,只需要對類型進行判斷,如果與屬性相符返回相應的rowValue,如果不相符嘗試轉(zhuǎn)換或直接返回nil(如果是Value版本返回默認值)
面向協(xié)議編程(續(xù))
上文已經(jīng)使用了Comparable和Collection協(xié)議把JSON結(jié)構(gòu)體擴展為了swift集合類型,并通過集合類型內(nèi)置的subscript特性獲得了非常方便的獲取復雜JSON結(jié)構(gòu)體任意深度數(shù)據(jù)的方式。
本文繼續(xù)分析LiteralConvertible RawRepresentable CustomStringConvertible CustomDebugStringConvertible 等協(xié)議在SwiftyJSON中的使用。
關(guān)于LiteralConvertible系列協(xié)議
實現(xiàn)該系列協(xié)議可以獲得直接使用字面值生成實例的特性。如let str = "hello",之所以String類型可以直接使用字符串字面值"hello"來生成實例str,就是因為String類型實現(xiàn)了ExpressibleByStringLiteral協(xié)議。
可想而知,協(xié)議內(nèi)容就是一個以指定類型為參數(shù)的構(gòu)造方法。
關(guān)于RawRepresentable協(xié)議
RawRepresentable協(xié)議提供的是原類型實例與協(xié)議中rawValue類型實例的相互轉(zhuǎn)化能力,一般用在枚舉類型。SwiftyJSON中主要通過以rawValue為基礎(chǔ)擴展rawData和rawString來實現(xiàn)JSON結(jié)構(gòu)體序列化為Data String等類型。
協(xié)議內(nèi)容為一個以rawValue為參數(shù)的構(gòu)造方法和一個rawValue屬性
關(guān)于CustomStringConvertible和CustomDebugStringConvertible 協(xié)議
實現(xiàn)該協(xié)議可以在控制臺把實例的有用信息打印出來,協(xié)議內(nèi)容是一個description的字符串類型屬性