Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 类型为'的值;NSArray.Element';(aka';Any';)没有下标_Swift - Fatal编程技术网

Swift 类型为'的值;NSArray.Element';(aka';Any';)没有下标

Swift 类型为'的值;NSArray.Element';(aka';Any';)没有下标,swift,Swift,我在Xcode中打开了一个旧的ios项目,其中有关于swift 4更新的警告。 在修复错误的过程中,我找不到解决方案。 错误发生在循环jsonArray时,将值传递给变量 let url=NSURL(string:"http://webserver.com/json") let data = NSData(contentsOf: url! as URL) do { let jsonResult = try JSONSerialization.jsonObject

我在Xcode中打开了一个旧的ios项目,其中有关于swift 4更新的警告。 在修复错误的过程中,我找不到解决方案。 错误发生在循环jsonArray时,将值传递给变量

let url=NSURL(string:"http://webserver.com/json")
    let data = NSData(contentsOf: url! as URL)

    do {
        let jsonResult = try JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
        let jsonArray = jsonResult.value(forKey: "person") as! NSArray

        for json in jsonArray {
            let id = json["id"] as? Int?
            let name = json["name"] as? String
            let age = json["age"] as? String

            tableID.append(String(id!))
            tableName.append(name!)
            tableAge.append(age!)

            tableView.reloadData()
        }

    } catch {

    }
代码中有很多不允许的地方

  • NSURL
    NSData
  • NSArray
    NSDictionary
    (导致错误的原因)
  • (NS)数据(内容)
  • 值(forKey:)
  • .mutableContainers
  • 忽略
    catch
    块中的错误
实际的本机Swift语法是

let url = URL(string:"http://webserver.com/json")!
let task = URLSession.shared.dataTask(with: url) { [unowned self] (data, response, error) in
    if let error = error { print(error); return }

    do {
        if let jsonResult = try JSONSerialization.jsonObject(with: data!) as? [String:Any],
           let jsonArray = jsonResult["person"] as? [[String:Any]] {

           for json in jsonArray {
                let id = json["id"] as! Int
                let name = json["name"] as! String
                let age = json["age"] as! String

                self.tableID.append(String(id))
                self.tableName.append(name)
                self.tableAge.append(age)
            }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }      
        }

    } catch {
      print(error)
    }
}
task.resume()
还有一个问题没有解决:不要将多个数组用作数据源

代码中有很多不允许的地方

  • NSURL
    NSData
  • NSArray
    NSDictionary
    (导致错误的原因)
  • (NS)数据(内容)
  • 值(forKey:)
  • .mutableContainers
  • 忽略
    catch
    块中的错误
实际的本机Swift语法是

let url = URL(string:"http://webserver.com/json")!
let task = URLSession.shared.dataTask(with: url) { [unowned self] (data, response, error) in
    if let error = error { print(error); return }

    do {
        if let jsonResult = try JSONSerialization.jsonObject(with: data!) as? [String:Any],
           let jsonArray = jsonResult["person"] as? [[String:Any]] {

           for json in jsonArray {
                let id = json["id"] as! Int
                let name = json["name"] as! String
                let age = json["age"] as! String

                self.tableID.append(String(id))
                self.tableName.append(name)
                self.tableAge.append(age)
            }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }      
        }

    } catch {
      print(error)
    }
}
task.resume()

还有一个问题没有解决:不要将多个数组用作数据源

如果我没记错的话,在过去,当
Foundation
被导入到支持objective C的平台上时,Swift对
Any
进行了特殊处理。它将支持向其发送任何消息,即使任何特定值
Any
可能不会响应您试图发送的消息。该功能最终被删除。虽然便于ObjC互操作,但它是隐式的,并且(在编译时)容易出错。如果我没记错的话,在过去,当
Foundation
导入到支持objective C的平台上时,Swift对
Any
进行了特殊处理。它支持向它发送任何消息,即使任何特定值
any
可能不会响应您试图发送的消息。该功能最终被删除。虽然ObjC互操作很方便,但它是隐式的,并且(在编译时)容易出错。更好的是:使用codable。@Alexander RestoreMonica确实如此,但我不想过度训练OP。更好的是:使用codable。@Alexander RestoreMonica确实如此,但我不想过度训练OP