簡體   English   中英

Swift:從Swift 2轉換為Swift 3失敗

[英]Swift: Conversion from Swift 2 to Swift 3 Failing

我現在已經來這幾天了。
我只是想將我的項目從Swift 2轉換為Swift 3,並且已經修復了很多錯誤。
但是,我到了最后19個,所有這些都是相同的錯誤。
基本上,我有一個對返回JSON對象的服務器的請求。
該JSON對象在其側面具有嵌套對象。
我一直在谷歌搜索和閱讀多個小時,嘗試各種不同的方法,但不幸的是,沒有任何效果。
任何幫助表示贊賞。
(注意:有人問我以前的問題,以發布我已經嘗試過的內容。
我不會在這里這樣做,因為我嘗試了許多不同的方法來解決此問題)

錯誤:類型“ Any”沒有下標成員

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. 輸入任何? 沒有下標成員
  2. 下標成員的Facebook SDK錯誤
  3. 類型“任何”沒有下標成員(firebase)
  4. 類型'Any'在xcode 8 Swift 3中沒有下標成員
  5. 更新為Swift 3后,類型'Any'沒有下標成員

任何幫助是極大的贊賞!

您好,您可以嘗試以下操作:

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
               }
             }
           }
         }
       }

請讓我知道它是如何工作的,以便我們找出來:)

好的,因此在獲得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
        }
    }
}

您不應該轉換為NSArray ,而應該轉換為[AnyObject] 在枚舉NSArray ,在Swift 3中, id項類型映射為Any ,而實際上沒有下標。 您可以在標准庫文檔中找到有關Any vs AnyObject更多信息,此Swift 3 提案中對此Swift 3更改將id視為Any vs AnyObject進行了說明。

      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解析,您可能不喜歡第三方模塊,但是上面的代碼將在錯誤輸入時崩潰(如果item沒有鍵“ id”或不是字符串)。 當然,這不是像SwiftyJSON或Freddy這樣的庫是在Swift中編寫健壯的JSON解析代碼的唯一方法,但是Cocoa提供的工具肯定不是在使用Swift類型系統,這對程序員沒有好處,而且很容易沾沾自喜使用該API輸入,解析任務就更加復雜(很可能不會真正使程序崩潰,而應該將其報告為錯誤)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM