前言:
SwiftJSON用起来是非常舒服的
比如这种东西,再也不需要判断 ? !了 很舒服
image.png
下面看下内部代码:
1.拿值的时候
原理:
JSON 是一个结构体
内部用到了很多协议
通过把请求拿到的数据 在内部进行了转换
json字符串 -> json对象 -> JSON结构体对象
init方法最终都回归到
![](https://img.haomeiwen.com/i1695156/47baccd05b43104a.png)
object通过set get方法
![](https://img.haomeiwen.com/i1695156/96d3a16af3507e8c.png)
在unwrap方法中进行了多次的递归
2.取值的时候:
比如:
json["respCode"].stringValue
这个是通过下标访问
这个是需要实现
![](https://img.haomeiwen.com/i1695156/8cd42f776f832add.png)
注释上还标着 这两种写法,有空可以都试试 因人喜好
![](https://img.haomeiwen.com/i1695156/66d7a5e98730d251.png)
通过取 key “respCode” 进行获取
![](https://img.haomeiwen.com/i1695156/45f511316a34fb4b.png)
获取o值后 再进行
![](https://img.haomeiwen.com/i1695156/c35c1289c1982d81.png)
比如字符串 “0”
他会先生成并规定了 是一个number类型的数据
![](https://img.haomeiwen.com/i1695156/5abdf14b55dbe499.png)
取的时候 我们如果取字符串类型的话
![](https://img.haomeiwen.com/i1695156/f69f1c0bf35646cd.png)
stringValue的get方法 会把他之前的类型判断出来 然后进行获取 转为字符串给我们发过来
3.ExpressibleByStringLiteral协议
看到源码中用到了很多
![](https://img.haomeiwen.com/i1695156/d4068408d4c287a5.png)
这是干嘛的??
查询后
在Swift的标准库中,大约有63种协议,每一个都有对我们编程都有很大的帮助,其中ExpressibleByStringLiteral非常的有意思,看它的命名可以确定它和表达式有关,举个例子:
let url = URL(string: "https://www.apple.com")!
我们对于URL来说当我们要传入一个URL的字符串形式,可以这么做,那么我们看如果实现了ExpressibleByStringLiteral我们可以怎么做:
let url: URL = "https://www.apple.com"
是的!可以这么做,那怎么实现这种方式呢?
extension URL: ExpressibleByStringLiteral {
public init(stringLiteral value: String) {
guard let url = URL(string: value) else {
preconditionFailure("URL initialize failure")
}
self = url
}
}
let url: URL = "https://www.apple.com"
嗯~ 就是这样的,看起来还不错。所以对于ExpressibleByStringLiteral来说,就是把一个字符串表达式转换成一个不是字符串的对象。当然实现init方法里你要自己去琢磨一下怎么去写。
竟然还有这种写法 哈哈
网友评论