Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Swift 3和Xcode 8中的嵌套字典中获取值时出现问题_Swift_Xcode_Swift3_Xcode8 - Fatal编程技术网

从Swift 3和Xcode 8中的嵌套字典中获取值时出现问题

从Swift 3和Xcode 8中的嵌套字典中获取值时出现问题,swift,xcode,swift3,xcode8,Swift,Xcode,Swift3,Xcode8,我用以下方法解析JSON: let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) 并得到以下嵌套字典作为结果 { response = { GeoObjectCollection = { featureMember = ( { GeoObject = { Point = { pos = "40.275713

我用以下方法解析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,我收到一个错误:

类型Any没有下标成员


如何用Xcode 8修复Swift 3?我已经读到我可以用最新的Xcode在swift 3中嵌入字典,但我不知道如何使它工作。我读过,但它对我的情况确实没有帮助。

问题是您没有指定
字典
对象的类型,您需要像这样明确地将
字典
对象的类型指定为
字典

let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as! [String: Any]

if let response = dictionary["response"] as? [String: Any], 
   let geoObjectCollection = response["GeoObjectCollection"] as? [String: Any],
   let featureMember = geoObjectCollection["featureMember"] as? [[String: Any]] {

     if let geoObject = featureMember[0]["GeoObject"] as? [String: Any],
        let point = geoObject["Point"] as? [String: String] {
            let latLongArray = point["pos"].components(separatedBy: " ")
            let latitudeString = latLongArray[1]
            let longitudeString = latLongArray[0]
     }
}

问题是您没有指定
dictionary
对象的类型,您需要像这样显式地将
dictionary
对象的类型指定为
dictionary

let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as! [String: Any]

if let response = dictionary["response"] as? [String: Any], 
   let geoObjectCollection = response["GeoObjectCollection"] as? [String: Any],
   let featureMember = geoObjectCollection["featureMember"] as? [[String: Any]] {

     if let geoObject = featureMember[0]["GeoObject"] as? [String: Any],
        let point = geoObject["Point"] as? [String: String] {
            let latLongArray = point["pos"].components(separatedBy: " ")
            let latitudeString = latLongArray[1]
            let longitudeString = latLongArray[0]
     }
}

您的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数据中一些不相关的成员,这可能会破坏这一转换

因此,您可以一步一步走,在某些情况下,在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
s对于Swift 3中的每个可选绑定都是必需的。如果愿意,您可以将所有
AnyObject
s更改为
Any
s。)

您的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数据中一些不相关的成员,这可能会破坏这一转换

因此,您可以一步一步走,在某些情况下,在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
s对于Swift 3中的每个可选绑定都是必需的。如果您愿意,您可以将所有
AnyObject
s更改为
Any
s。)

可能重复我检查了主题@Larme,但对我的情况没有帮助,因此仍然不知道如何解决Swift 3/Xcode 8中的问题。如果我将dictionary强制转换为[AnyObject],我仍然会收到一个错误,即类型[AnyObject]没有下标成员。我已经检查了主题@Larme,但它对我没有帮助,因此仍然不知道如何解决Swift 3/Xcode 8中的问题。如果我将dictionary强制转换为[AnyObject],我仍然会收到一个错误,类型[AnyObject]没有下标成员。我尝试过这样做,但仍然收到类型“Any”没有下标成员,我尝试让dictionary=try JSONSerialization.jsonObject(数据为:geocodingResultsData,选项:.mutableContainers)为![String:Any]并让dictionary=尝试JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:AnyObject]但在这两种情况下,get类型“Any”都没有下标。我尝试了这样做,但接收类型“Any”没有下标成员,我尝试了让dictionary=try JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:Any]并让dictionary=try JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:AnyObject],但在这两种情况下,get类型“Any”都没有下标eamber