美文网首页ios学习iOS Dev
SwiftJSon源码阅读 --- 递归取值

SwiftJSon源码阅读 --- 递归取值

作者: David_Cap | 来源:发表于2015-12-10 14:47 被阅读212次

    前言

    SwiftJSon 可以说是Swift中比较好用的对JSon数据处理的第三方。心血来潮就阅读了一下源码,发现了里面比较有趣的部分,递归的用 [] 去取值。

    SwiftJSon的用法(结合Alamofire)

    用法大致如下。

      Alamofire.request(.GET, "URL").responseJSON { (response) -> Void in
                
                if let value = response.result.value {
                    //结合Alamofire的使用
                    let json = JSON(value) // -> 获取Json模型
                    printf(json["property1"][0]["property2"])
                }
            }
    

    这样就可以比较方便的取值了。

    SwiftJSon 递归取值的秘密

    总体上来说,只要是因为 重写了取下标的方法 subscript(key : String) -> DDJsonModel

    具体的话 听我 娓娓道来。

    第一 定义数据结构

    为了 测试,我们先定义一个 结构体(比较方便)

    public struct DDJsonModel{
         var object:AnyObject!
        
        public init(_ object: AnyObject?) {
            self.object = object
        }
    }
    
    

    这里面的 object 就是用来记录这个结构体实际表达的值的一个数据类型。

    init方法就是把实际的值给自身的object 有一点set方法的意味

    第二 重写方法

    重写如下方法

        //取字典的Value
        subscript(key : String) -> DDJsonModel
        {
            get
            {
                if let dict = self.object
                {
                    if let value =  dict[key]
                    {
                        return DDJsonModel(value)
                    }
                    else
                    {
                        print("类型错误")
                    }
                }
                print("没有对应的Key")
                return DDJsonModel(NSNull)
            }
        }
        
        //取数组的Value
        subscript(key : Int) -> DDJsonModel
        {
            get
            {
                if let dict = self.object
                {
                    guard key < self.object.count else{
                        print("数组越界")
                        return DDJsonModel(NSNull)
                    }
                    
                    if let value =  dict[key]
                    {
                        return DDJsonModel(value)
                    }
                    else
                    {
                        print("类型错误")
                    }
                }
                return DDJsonModel(NSNull)
            }
        }
        
    

    我来解释一下啊,重写subscript的Get方法。

    如果不重写,那么subscript返回的应该是一个AnyObject,这样就要用as Dictionart 才能继续取值。

    而这里重写了,返回的是一个 DDJsonMode的结构体,所以可以一起递归下去。

    再者如果没有数字越界,Key没有问题。那么返回的应该是一个 DDJsonModel(dict[key]),也就是下一个Object。也就是一直会取值到根节点返回 NSNull

    于是便实现了 递归查找。

    Demo

    Demo

    相关文章

      网友评论

        本文标题:SwiftJSon源码阅读 --- 递归取值

        本文链接:https://www.haomeiwen.com/subject/xukyhttx.html