gpt4 book ai didi

Swift 作为重载

转载 作者:搜寻专家 更新时间:2023-11-01 05:36:24 25 4
gpt4 key购买 nike

我正在创建简单的 Json 解析器,它的工作方式如下:我有 JsonData 类,其中包含 Anyobject 作为数据。当我使用 jsonData["key"] 它返回 JsonData 到我可以链接 jsonData["key"]["key2"] 等。

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

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

这样的变通方法

jsonData["key"].data 作为字符串

代码:

   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)
}

}

最佳答案

为了做到这一点,您需要添加另一个重载,但它不会像您想象的那样工作。

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 访问。

关于Swift 作为重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38438571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com