2016-10-03 156 views
2

我一直在這裏待了幾天。
我只是試圖將我的項目從Swift 2轉換爲Swift 3,並且修復了很多錯誤。
但是,我倒到了最後的19個,所有這些都是相同的錯誤。
基本上,我有一個請求返回一個JSON對象的服務器。
JSON對象在其一側嵌套了對象。
我一直在谷歌和閱讀多個小時嘗試不同的事情,不幸的是,沒有任何工作。
任何幫助表示讚賞。
(注:我已經被問過以前的問題,發佈了什麼我已經嘗試
我不打算在這裏做,因爲我已經嘗試了許多不同的方法來解決這個問題。)Swift:從Swift 2到Swift 3的轉換失敗

錯誤:鍵入「任意」有沒有標會員

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

這裏有幾件事情我已經嘗試:

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item):[String:AnyObject] in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for (index, item) in data.enumerated() as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
    if let data = response["data"] as? NSArray { 
     for item in data as? NSArray { 
      let id = item["id"] as! String 
     } 
    } 
} 

固定的問題以上都不是。下面是我所引用的SOF問題:

  1. type any? has no subscript members
  2. Facebook SDK error for subscript members
  3. Type 'Any' has no subscript members (firebase)
  4. Type 'Any' Has no Subscript Members in xcode 8 Swift 3
  5. Type 'Any' has no subscript members after updating to Swift 3

任何幫助,不勝感激!

+0

不要把東西當作'NSArray'。使用swift類型並將其轉換爲'[[[String:String]]]'或其它類型。 – dan

+0

顯示JSON,至少在'「data」:'後面有10個字符。 – vadian

回答

1

好了,從0ndre_的幫助,這裏是我如何解決這個問題。不幸的是,它不是多維/嵌套對象的完整解決方案,所以我不得不修改應用程序調用的API。

if let response = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) in data.enumerated() { 
      let id = item["id"] as! String 
     } 
    } 
} 
1

你好你可以試試這個:

if let response = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary { 
    if let data = response["data"] as? [AnyObject] { 
     for (index, item) { 
      if let id = item["id"] as! String{ 
       print(id) 
      } 
     } 
    } 
} 

let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary    

    if let parseJson = json {    
    if let data = parseJson["data"] as? [AnyObject] {     
    for signleArray in data {     
      if let customObjects = signleArray as? [AnyObject] {     
      for customObject in customObjects {     
       let userId = customObject["id"] as! String 
       } 
      } 
      } 
     } 
     } 

只要讓我知道它是如何工作,所以經過一些我們自己看着辦吧:)

+0

這些選項都不起作用,但感謝您的嘗試。我可能最終只需要實現SwiftJSON,我希望不必這樣做。我不喜歡依賴第三方模塊。 – recoilnetworks

1

您不應該投到NSArray,而是[AnyObject]。在枚舉NSArray時,在Swift 3中表示id item type maps to Any,這確實沒有下標。您會在Any vs AnyObjectin the standard library documentation上找到更多信息,並將此Swift 3更改爲處理id的原因爲AnyAnyObject的解釋爲in this Swift evolution proposal

 let inputData:Data = "{\"data\": [{\"id\":\"x\"},{\"id\":\"y\"},{\"id\":\"z\"}]}".data(using: .utf8)! 

     if let response = try JSONSerialization.jsonObject(with: inputData, options: []) as? [String:AnyObject], 
     let responseData = response["data"] as? [AnyObject] 
     { 
      for (index, item) in responseData.enumerated() 
      { 
       let id = item["id"] as! String 
       print(id) 
      } 
     } 

使用第三方庫,如SwiftyJSON的JSON解析至於,你可能不喜歡第三方模塊,但上面的代碼會崩潰的錯誤輸入(如果項目沒有關鍵的「ID」,或者如果它是不是字符串)。當然,不像SwiftyJSON或Freddy這樣的庫是在Swift中編寫健壯的JSON解析代碼的唯一方法,但Cocoa提供的工具肯定不會使用Swift類型系統來爲程序員帶來好處,並且很容易讓人自滿使用該API輸入,解析任務就越複雜(這很可能不會真的使程序崩潰,但應該報告爲錯誤)。