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

Posted

技术标签:

【中文标题】尝试从 swift 2 中的 JSON 文件中读取重载错误出现【英文标题】:Trying to read from a JSON file in swift 2 overload error showing up 【发布时间】: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 上有很多其他示例。 【参考方案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
        
    

所以基本上:

    NSData(contentsOfFile: path, options: 不再出错。 dictionary: AnyObject? = try NSJSONSerialization.JSONObjectWithData(data, options 不再出错。 从文件中获取 NSData 需要尝试捕获 从 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 我相信应用文档就足够了。尽管如此,请针对您的新问题提出一个新问题,并将链接发送给我,我会尽力提供帮助 让我们continue this discussion in chat。

以上是关于尝试从 swift 2 中的 JSON 文件中读取重载错误出现的主要内容,如果未能解决你的问题,请参考以下文章

无法在单元测试项目中的 Swift 中读取 JSON 文件

尝试从 create-react-app 中的 .json 文件中读取图像

尝试从 Swift 2.0 中的 json 解析数据时出错?

Swift 中的 Array 扩展以使用 NSPropertyListReadOptions 从 plist 中读取数组

如何使用与 NewtonSoft (JSON.Net) 组件中的 JSON 匹配的 Swift 类从/向 JSON 读取/写入对象数组?

附加 JSON 数据 Swift