2014-10-06 20 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?)。