我们引入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)。