2014-10-06 45 views
0

我有这个json结果。 我会采取“警报”字段。 我试试这个:NSDictionary在swift中进行提示

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。

+2

'features'是一个数组,而不是字典。 – jlehr 2014-10-06 19:01:20

回答

1

正如@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类型的值遇到具有类型
  • 的值大于NSDictionary和不同发现
  • 一个nil值被发现

在第一种情况下,它返回T类型的值 - 在它返回nil其它情况。 - 所以有必要

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

正如你所看到的,它是一个通用的方法,并且返回类型从结果赋值给变量的类型推断:

如下您可以使用它明确定义它的类型,必须是可选的(在这个特定情况下为String?)。

相关问题