试图从swift 2中出现的JSON文件读取过载错误

m.u*_*mar 2 xcode json ios swift

嗨,所以这里是用于解析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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Wil*_*aan 6

您使用的是不是最新的快速代码,

我纠正了你的代码,注意你应该选择最好的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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上:

  1. NSData(contentsOfFile: path, options:不采取错误了.
  2. dictionary: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data, options不采取错误了.
  3. 从文件中获取NSData需要try catch
  4. 从NSData获取json对象需要try catch