首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:从Swift 2转换为Swift 3失败

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

Stack Overflow用户
提问于 2016-10-03 22:40:17
回答 3查看 297关注 0票数 2

我已经干了几天了。

我只是试图将我的项目从Swift 2转换为Swift 3,并且我已经修复了一些错误。

然而,我只剩下最后19条,所有这些都是同样的错误。

基本上,我对返回JSON对象的服务器有一个请求。

JSON对象的一侧有嵌套的对象。

我在谷歌上搜索和阅读了好几个小时,尝试着不同的东西,不幸的是,没有什么效果。

任何帮助都是非常感谢的。

(注:我在以前的问题中被要求张贴我已经尝试过的内容。

我不会在这里这样做,因为我已经尝试了很多不同的方法来解决这个问题)

错误:键入'Any‘没有下标成员

代码语言:javascript
复制
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
        }
    }
}

以下是我尝试过的几件事:

代码语言:javascript
复制
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错误
  3. 类型'Any‘没有下标成员(火基)
  4. 类型'Any‘在xcode 8 Swift 3中没有子脚本成员
  5. 在更新到Swift 3之后,类型'Any‘没有下标成员

任何帮助都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-05 19:31:50

好的,在0ndre_的帮助下,我是如何解决这个问题的。不幸的是,对于多维/嵌套对象,它不是一个完整的修复程序,所以我不得不修改应用程序正在调用的API。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-10-04 19:12:07

你好,你可以试试这个:

代码语言:javascript
复制
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)
            }
        }
    }
}

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-10-05 22:20:01

您不应该转换为NSArray,而应该转换为[AnyObject]。当枚举一个NSArray时,在Swift 3中那个Any实际上没有下标。您将找到更多关于Any vs AnyObject 在标准库文档中的信息,以及将id视为Any vs AnyObject的Swift 3更改的基本原理将解释在这个迅速发展的建议中

代码语言:javascript
复制
      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的错误输入感到自满,解析任务越复杂(解析任务很可能不应该真的崩溃您的程序,而应该报告为错误)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39841527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档