gpt4 book ai didi

swift - 在 Swift 3 和 Xcode 8 中从嵌套字典中获取值的问题

转载 作者:行者123 更新时间:2023-11-28 11:03:54 26 4
gpt4 key购买 nike

我用这个解析 JSON:

 let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers)

结果得到下面的嵌套字典

{ response =  { GeoObjectCollection = { featureMember =  
(
{ GeoObject = { Point = { pos = "40.275713 59.943413"; }; }; },
{ GeoObject = { Point = { pos = "40.273162 59.944292"; }; }; }
);
};
};
}

我试图从这个字典中获取坐标值并将它们保存到新的 latutudeString 和 longitudeString 变量中

在 Xcode 8 GM 之前,它使用以下代码对我有用:

 if let jsonCoordinatesString: String = dictionary["response"]!!["GeoObjectCollection"]!!["featureMember"]!![0]["GeoObject"]!!["Point"]!!["pos"]!! as? String {

var latLongArray = jsonCoordinatesString.components(separatedBy: " ")

let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]

}

但是因为我已经安装了 Xcode 8 GM,所以我收到一个错误:

Type Any has no Subscript members

enter image description here

如何使用 Xcode 8 修复它的 Swift 3?我读过我可以转换它,但不知道如何使用最新的 Xcode 在 swift 3 中使用我的嵌套字典。我读过 can't resolve "Ambiguous use of subscript"但这对我的情况确实没有帮助。

最佳答案

您的 JSON 数据在 Swift 中具有这种类型:

[String: [String: [String: [[String: [String: [String: String]]]]]]]

我会避免使用这种嵌套太深的类型,但如果你敢用,你可以这样写:

enum MyError: Error {
case invalidStructure
}
do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: [String: [String: [[String: [String: [String: String]]]]]]] else {
throw MyError.invalidStructure
}
if let jsonCoordinatesString: String = dictionary["response"]?["GeoObjectCollection"]?["featureMember"]?[0]["GeoObject"]?["Point"]?["pos"] {

var latLongArray = jsonCoordinatesString.components(separatedBy: " ")

let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]

}
} catch let error {
print(error)
}

但是您可能隐藏了一些不相关的 JSON 数据成员,这可能会破坏此 as? 转换。

所以,你可以一步一步来,在某些情况下,在 Swift 3 中“需要”,像这样:

do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: AnyObject] else {
throw MyError.invalidStructure
}
if
let response = dictionary["response"] as? [String: AnyObject],
let geoObjectCollection = response["GeoObjectCollection"] as? [String: AnyObject],
let featureMember = geoObjectCollection["featureMember"] as? [[String: AnyObject]],
!featureMember.isEmpty,
let geoObject = featureMember[0]["GeoObject"] as? [String: AnyObject],
let point = geoObject["Point"] as? [String: AnyObject],
let jsonCoordinatesString = point["pos"] as? String
{
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")

let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]

}
} catch let error {
print(error)
}

(let对于 Swift 3 中的每个可选绑定(bind)都是强制性的。并且您可以将所有 AnyObject 更改为 Any,如果你喜欢。)

关于swift - 在 Swift 3 和 Xcode 8 中从嵌套字典中获取值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39392630/

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