仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1653|回复: 9
打印 上一主题 下一主题

[学习教程] IOS编程:SwiftyJSON库的利用和思索仓酷云

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:27:52 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
关于UIView的子类有很多UIButtonUITableView这个都需要各个击破看看文档从名字上就很容易理解是做什么的UIViewController是管理View和Model的类(@张开说UIViewController是用来管理view的,管理model的类自己写,当然,model也可以用UIViewController来管理,不过恐怕成为不好的代码。比来看了一些收集哀求的例子,发明Swift在剖析JSON数据时出格别扭,老是要写一年夜堆的downcast(as?)和可选(Optional),看?号都看花了。随后发明了这个库SwiftyJSON,成绩水到渠成,灰常文雅和Swifty!
复杂先容下这个库(内容译自SwiftyJSON的README):
为何典范的在Swift中处置JSON的办法欠好?

Swift言语是一种严厉的范例平安言语,它请求我们显现的设置范例,并匡助我们写出更少bug的代码。可是当处置JSON这类生成就是隐式范例的数据布局,就十分贫苦了。
拿Twitter中timelineAPI前往的数据为例:
  1. [{......"text":"justanothertest",......"user":{"name":"OAuthDancer","favourites_count":7,"entities":{"url":{"urls":[{"expanded_url":null,"url":"http://bit.ly/oauth-dancer","indices":[0,26],"display_url":null}]}......},"in_reply_to_screen_name":null,},......]
复制代码
Swift中的剖析代码会是如许:
  1. letjsonObject:AnyObject!=NSJSONSerialization.JSONObjectWithData(dataFromTwitter,options:NSJSONReadingOptions.MutableContainers,error:nil)ifletstatusesArray=jsonObjectas?NSArray{ifletaStatus=statusesArray[0]as?NSDictionary{ifletuser=aStatus["user"]as?NSDictionary{ifletuserName=user["name"]as?NSDictionary{//终究我们失掉了`name`}}}}
复制代码
欠好吧。就算是换成可选链式挪用,也仍是一团糟:
  1. letjsonObject:AnyObject!=NSJSONSerialization.JSONObjectWithData(dataFromTwitter,options:NSJSONReadingOptions.MutableContainers,error:nil)ifletuserName=(((jsonObjectas?NSArray)?[0]as?NSDictionary)?["user"]as?NSDictionary)?["name"]{//下面这一堆是个啥??}
复制代码
利用SwiftyJSON

你只需如许做就好了:
  1. letjson=JSONValue(dataFromNetworking)ifletuserName=json[0]["user"]["name"].string{//恩~`name`得手,就这么复杂}
复制代码
你不必要思索可选范例的拆包和是不是能拆包的判别,这些都主动完成了:
  1. letjson=JSONValue(dataFromNetworking)ifletuserName=json[999999]["wrong_key"]["wrong_name"].string{//冷清,嘿嘿~挪用不存在的["wrong_key]也不会crash滴,.string终极能平安的前往一个字符串或`nil`}
复制代码
  1. letjson=JSONValue(jsonObject)switchjson["user_id"]{case.JString(letstringValue):letid=stringValue.toInt()case.JNumber(letdoubleValue):letid=Int(doubleValue)default:println("ooops!!!JSONDataisUnexpectedorBroken")
复制代码
跋文:SwiftyJSON是怎样做到的?

看到这个库以后,一方面很爽终究有符合的处置JSON的办法了;另外一方面内心实在很猎奇它是怎样做到的?
经由过程看源代码,才懂得到它是创立了一个JSONValue列举,这个列举中有一个JInvalid范例。当利用json字符串来机关JSONValue对象时,假如没法构建乐成,就会前往这个JInvalid列举对象,然后对这个JInvalid列举对象持续处置,会持续前往JInvalid。直到对其挪用string,number,bool之类来猎取Swift中的数据范例值时,才会前往nil。
这套机制是相似于Optional<T>可选范例的,可是分歧的是,Optional中对nil挪用办法会crash,但JSONValue中对JInvalid挪用办法不会crash,而是持续前往JInvalid。如许利用时就不必写一堆?号啦,归正不会堕落滴。
同时,它给JSONValue列举还创立了别的json中利用到的各类范例JNumber,JString,JBool,它们能经由过程机关器将原始值包装起来,然后最初经由过程对应的number,string,bool等属性办法来拆包,失掉原始值。
保举人人也读读这个库的源代码,其对enum的利用灰常奇妙!
json-swift和SwiftyJSON的对照

比来微博上@SwiftLanguage让我对这两个库做个复杂对照,以是就有了下文:
json-swift和SwiftyJSON都利用了一个自界说的列举范例来形貌JSON数据;经由过程重载完成了相似Array和Dictionary的下标操纵;并能够将NSData范例的json实例转换成其对应的列举范例的实例。

当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-20 02:38

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表