다음과 같이 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의 중첩 사전과 함께 작동하도록 만드는 방법을 정확히 모릅니다. 나는 "아래 첨자의 모호한 사용"을 해결할 수 없다는 것을 읽었 지만 제 경우에는 실제로 도움이되지 않았습니다.
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의 각 Optional-bindings에 필수입니다 . 원하는 경우 모든를 AnyObject
s로 변경할 수 있습니다 Any
.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다