【问题标题】:Trying to read from a JSON file in swift 2 overload error showing up尝试从 swift 2 中的 JSON 文件中读取重载错误出现
【发布时间】:2015-10-29 11:17:49
【问题描述】:

嗨,这里是在 Swift 2 中解析 JSON 文件的样板代码。我以前用过它,它可以工作,但由于某种原因,它在最新版本的 Xcode 7.1 和 Swift 2 中被破坏了。对这些人有什么想法吗?错误是“参数标签 '(contentsOfFile:, options:, error:)' 不匹配任何可用的重载”

import Foundation

extension Dictionary {
    static func loadJSONFromBundle(filename: String) -> Dictionary<String, AnyObject>? {
        if let path = NSBundle.mainBundle().pathForResource(filename, ofType: "json") {

            var error: NSError?
            let data = NSData(contentsOfFile: path, options: NSDataReadingOptions, error: &error)
            if let data = data {
                let dictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data,
                    options: NSJSONReadingOptions(), error: &error)
                if let dictionary = dictionary as? Dictionary<String, AnyObject> {
                    return dictionary
                } else {
                    print("Level file '\(filename)' is not valid JSON: \(error!)")
                    return nil
                }
            } else {
                print("Could not load level file: \(filename), error: \(error!)")
                return nil
            }
        } else {
            print("Could not find level file: \(filename)")
            return nil
        }
    }
}

【问题讨论】:

  • 我们使用 NSJSONSerialization 的方式在 Swift 2 中发生了变化。Example here. SO 上有很多其他示例。

标签: ios json xcode swift


【解决方案1】:

您使用的不是最新的 swift 代码,

我更正了你的代码,注意你应该选择最适合你的NSDataReadingOption,我选择NSDataReadingOptions.DataReadingMapped

加上一些 api 不将错误作为输入,所以我删除了它。

请注意,当您捕获错误时,您可以使用明确声明的对象error,这就是我删除错误变量的原因

最后,解析json的新api应该在try catch中,这就是我添加try catch的原因

import Foundation

extension Dictionary {
    static func loadJSONFromBundle(filename: String) -> Dictionary<String, AnyObject>? {
        if let path = NSBundle.mainBundle().pathForResource(filename, ofType: "json") {


            do{
                let data = try NSData(contentsOfFile: path, options: NSDataReadingOptions.DataReadingMapped)
                do{
                    let dictionary: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data,
                        options: NSJSONReadingOptions())
                    if let dictionary = dictionary as? Dictionary<String, AnyObject> {
                        return dictionary
                    } else {
                        print("Level file '\(filename)' is not valid JSON")
                        return nil
                    }
                }catch {
                    print("Level file '\(filename)' is not valid JSON: \(error)")
                    return nil
                }


            }catch {
                print("Could not load level file: \(filename), error: \(error)")
                return nil
            }

        } else {
            print("Could not find level file: \(filename)")
            return nil
        }
    }
}

所以基本上:

  1. NSData(contentsOfFile: path, options: 不再出错。
  2. dictionary: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data, options 不再出错。
  3. 从文件中获取 NSData 需要尝试捕获
  4. 从 NSData 获取 json 对象需要 try catch

【讨论】:

  • 在哪里可以找到有关 Swift 2 中所有更改的更新指南。这是我遇到的另一件事错误。 'enumerate' 不可用:调用序列上的 'enumerate()' 方法
  • if let dictionary = Dictionary.loadJSONFromBundle(filename) { if let tilesArray: AnyObject = dictionary["tiles"] { for (row, rowArray) in enumerate(tilesArray as! [ [整数]]) {
  • @SheikhMuhammadUmar 我相信应用文档就足够了。尽管如此,请针对您的新问题提出一个新问题,并将链接发送给我,我会尽力提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
相关资源
最近更新 更多