ios - 快速取消 NSDictionary

标签 ios swift

我有这个 json 结果。 我会采取“警报”字段。 我试试这个:

var alert: NSString = jsonResult["features"]["properties"]["alert"]

但这是错误:没有名为“下标”的成员。 我无法访问嵌套字典中的字段

{
        features =     (
                    {
                geometry =             {
                    coordinates =                 (
                        "-97.95359999999999",
                        "37.2382",
                        5
                    );
                    type = Point;
                };
                id = usb000si7g;
                properties =             {
                    alert = green;
                    cdi = "5.8";
                    code = b000si7g;
                    detail = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/usb000si7g.geojson";
                    dmin = "0.017";
                    felt = 1258;
                    gap = 38;
                    ids = ",usb000si7g,";
                    mag = "4.3";
                    magType = mwr;
                    mmi = "4.94";
                    net = us;
                    nst = "<null>";
                    place = "8km SE of Harper, Kansas";
                    rms = "0.51";
                    sig = 864;
                    sources = ",us,";
                    status = reviewed;
                    time = 1412272884590;
                    title = "M 4.3 - 8km SE of Harper, Kansas";
                    tsunami = "<null>";
                    type = earthquake;
                    types = ",cap,dyfi,general-link,geoserve,losspager,moment-tensor,nearby-cities,origin,phase-data,shakemap,tectonic-summary,";
                    tz = "-300";
                    updated = 1412614943519;
                    url = "http://earthquake.usgs.gov/earthquakes/eventpage/usb000si7g";
                };
                type = Feature;
            }
        );
        metadata =     {
            api = "1.0.13";
            count = 1;
            generated = 1412617232000;
            status = 200;
            title = "USGS Significant Earthquakes, Past Week";
            url = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_week.geojson";
        };
        type = FeatureCollection;
    }

我不知道该怎么办。 swift 在每个测试版中都会更改。

最佳答案

正如@Kirsteins 所说是他的答案,你必须做很多解包,建议使用 JSON 库。

如果您仍然想坚持手工提取,那么我建议您以编程方式进行提取,例如向 NSDictionary 添加扩展,如下所示:

extension NSDictionary {
    func objectForTreeKeys<T>(keys:[String]) -> T? {
        var dict: NSDictionary? = self
        var retValue: T?

        for key in keys {
            var value: AnyObject? = dict?.objectForKey(key)

            if let unwrapped = value as? NSDictionary {
                dict = unwrapped
            } else if let unwrapped = value as? T {
                retValue = unwrapped
                break
            } else {
                retValue = nil
                break
            }
        }

        return retValue
    }
}

您将一组键传递给该函数,它会遍历所有嵌套字典,直到:

  • 遇到类型为T的值
  • 找到了一个类型不同于 NSDictionaryT 的值
  • 找到一个 nil

在第一种情况下,它返回 T 类型的值 - 在其他情况下它返回 nil

您可以按如下方式使用它:

let ret: String? = jsonResult.objectForTreeKeys(["features", "properties", "alert"])

如您所见,它是一个泛型方法,返回类型是从结果分配给的变量的类型推断出来的——所以有必要显式定义它的类型,它必须是可选的 (String? 在这种特定情况下)。

关于ios - 快速取消 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221932/

相关文章:

ios - 如何使用加速度计检查设备是否稳定?

iphone - 应用在iPhone 5.1模拟器和带有iOS 5.1的真实iPhone 4上的表现有所不同

ios - 具有 iOS 9 目标的 swift SFSafariViewControllerDelegate 要求 iOS 8.1 兼容性

ios - 在整个应用程序中重新调用应用程序委托(delegate)

swift - AWS Mobile Hub Google 身份验证 iOS

ios - 为什么我总是必须将 Sprite 的位置更改为其他位置才能获得所需的工作位置

ios - 为什么单元格高度为零

ios - 在 Swift 应用程序中检索用户数的有效方法

ios - 检查类型为 "NeXT/Apple typedstream"版本 4 (NSArchiver) 的文件

arrays - Firebase 存储异步图像下载顺序不正确