Swift:从Swift 2转换为Swift 3失败

时间:2016-10-03 22:40:17

标签: ios json swift casting swift3

我现在已经在这几天了。
我只是想把我的项目从Swift 2转换为Swift 3,我已经解决了很多错误。
但是,我是直到最后19,所有这些都是相同的错误。
基本上,我有一个返回JSON对象的服务器的请求。
该JSON对象在它的侧面有嵌套对象。我一直在谷歌搜索和阅读多个小时尝试不同的事情,不幸的是,没有任何工作。
任何帮助表示赞赏。
(注意:我已被问过以前的问题,发布我已经有的试过。
我不打算这样做,因为我尝试了很多不同的方法来解决这个问题。)

错误:输入'任何'没有下标成员

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
  6. 非常感谢任何帮助!

3 个答案:

答案 0 :(得分: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
               }
             }
           }
         }
       }

让我知道它是如何工作的,所以我们可以弄明白:)

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分:1)

您不应该转为NSArray,而是[AnyObject]。在枚举NSArray时,在Swift 3中id item type maps to Any,它确实没有下标。您会在AnyAnyObject in the standard library documentation上找到更多相关信息,以及将id视为Any vs {{ 1}}解释为in this Swift evolution proposal

AnyObject

关于使用第三方库(如SwiftyJSON进行JSON解析),您可能不喜欢第三方模块,但上面的代码会因输入错误而崩溃(如果项目没有密钥" id"或者如果它不是一个字符串)。它当然不像SwiftyJSON或Freddy这样的库是在Swift中编写健壮的JSON解析代码的唯一方法,但是Cocoa提供的工具当然不会使用Swift类型的系统来使程序员受益,而且#39 ;对于使用该API的错误输入容易自满,解析任务越复杂(这很可能不会导致程序崩溃,但应报告为错误)。