斯威夫特过载

时间:2016-07-18 13:54:32

标签: swift protocols anyobject

我正在创建简单的Json Parser,它的工作原理如下:我有一个包含Anyobject作为数据的JsonData类。当我使用jsonData [" key"]时,它返回JsonData,我可以链接jsonData [" key"] [" key2"]等。

我的问题是如何实现该类,以便我可以将其转换为String:

jsonData [" key"] as String,不使用像

这样的工作区

jsonData [" key"]。data as String

代码:

   class JsonData:CustomStringConvertible{
    let data:AnyObject

        var description: String{
        get{
            return "\(data)"
        }
    }
    init(_ data: Data) {
        self.data = try! JSONSerialization.jsonObject(with: data, options: []) as! [[String:AnyObject]]
    }

    init(_ data: AnyObject)    {
        self.data = data
    }

    subscript(key:String) -> JsonData{
        let newData = data as! [String:AnyObject]
        let test = newData[key]!
        return JsonData(test)
    }
    subscript(index:Int) ->JsonData{
        let newData = data[index]!
        return JsonData(newData)
    }

}

1 个答案:

答案 0 :(得分:0)

为了做到这一点,你要添加另一个重载,但它不会像你一样思考。

subscript(key: String) -> String {
    let newData = data as! [String:AnyObject]
    return newData[key] as! String
}

然后jsonData["key"] as String有效,但jsonData["key"]["key2"]含糊不清,你必须写(jsonData["key"] as JsonData)["key2"],这可能不是你想要的。

对此的简短回答是不要这样做。如果您需要这么多JSON访问权限,那么您可能错误地存储了数据。尽可能快地将其解析为结构,然后使用结构。如果需要,将结构转换回JSON。 AnyObject的广泛工作将会一次又一次地破坏你的大脑和编译器。 AnyObject是一个必要的邪恶,而不是每天的工具。很快你会遇到那个可怕的日子,你有一个AnyObject?而且编译器只是流下了眼泪。好吧,至少它不是Any

暂且不谈,更好的解决方案是使用带标签的下标。

subscript(string key: String) -> String {
    let newData = data as! [String:AnyObject]
    return newData[key] as! String
}

现在,您可以将其作为json[string: "key"]而不是json["key"] as String进行访问。