JSON

一段简单的JSON解析代码到底能重构几次?(5)

字号+ 作者:H5之家 来源:H5之家 2015-10-08 10:10 我要评论( )

我们引入JSONDecodable协议,让上面的类型遵守它。协议看起来是这样的: protocol JSONDecodable { class func decode(json: JSON) - Self?}然后,我们编写一个函数,解析任何遵守JSONDecodable协议的类型为Result

我们引入JSONDecodable协议,让上面的类型遵守它。协议看起来是这样的:

protocol JSONDecodable { class func decode(json: JSON) -> Self? }然后,我们编写一个函数,解析任何遵守JSONDecodable协议的类型为Result类型:
func decodeObject<A: JSONDecodable>(json: JSON) -> Result<A> { return resultFromOptional(A.decode(json), NSError()) // 自定义错误 }现在我们可以让User遵守协议:
struct User: JSONDecodable { let id: Int let name: String let email: String static func create(id: Int)(name: String)(email: String) -> User { return User(id: id, name: name, email: email) } static func decode(json: JSON) -> User? { return JSONObject(json) >>> { d in User.create <^> d["id"] >>> JSONInt <*> d["name"] >>> JSONString <*> d["email"] >>> JSONString } }

我们改变了User的解析函数,用可选的User替换掉Result<User>。这样我们就拥有了一个抽象的函数,可以在解码后调用resultFromOptional,替代之前模型中必须使用的decode函数。

最后,我们抽象performRequest函数中的解析和解码过程,让它们变得更加易读。下面是最终的performRequest和parseResult函数:

func performRequest<A: JSONDecodable>(request: NSURLRequest, callback: (Result<A>) -> ()) { let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, urlResponse, error in callback(parseResult(data, urlResponse, error)) } task.resume() } func parseResult<A: JSONDecodable>(data: NSData!, urlResponse: NSURLResponse!, error: NSError!) -> Result<A> { let responseResult = Result(error, Response(data: data, urlResponse: urlResponse)) return responseResult >>> parseResponse >>> decodeJSON >>> decodeObject }。

预告: 2015中国移动开发者大会(MDCC 2015)将于10月15-16日在北京新云南皇冠假日酒店召开。大会特设五大技术专场:平台与技术iOS、平台与技术Android、产品与设计、游戏开发、企业移动化。此外,大会更是首次举办国内极具权威影响力的IoT技术峰会,特设硬件开发技术与虚拟现实两大专场。大会将聚集国内最具实力的产品技术团队,与开发者一道进行最前沿的探讨与交流。

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。


 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • iOS入门学习(json解析)

    iOS入门学习(json解析)

    2016-01-26 09:00

  • iOS中json解析出现的null,nil,NSNumber的问题,jsonnsnumber

    iOS中json解析出现的null,nil,NSNumber的问题,jsonnsnumber

    2016-01-17 15:03

  • iOS开发Post请求错误:Error Domain=NSCocoaErrorDomain Code=3840

    iOS开发Post请求错误:Error Domain=NSCocoaErrorDomain Code=3840 "

    2015-11-23 19:03

  • 叶玲童鞋的课程

    叶玲童鞋的课程

    2015-11-23 12:17

网友点评
y