【问题标题】:Issue Getting NSData Request To Work In Swift 2.0问题让 NSData 请求在 Swift 2.0 中工作
【发布时间】:2015-11-14 15:01:11
【问题描述】:

我希望有人能够帮助我找出我正在尝试在 Swift 2.0 中编写(或学习编写)应用程序时遇到的问题。这以前在 Swift 1.2 中有效,但经过必要的转换后,我一直面临错误;

无法使用“(contenOfURL: NSURL, options: NSDataReadingOptions, error:nil)”类型的参数列表调用“NSData”类型的初始化程序

这是我正在使用的代码,略有截断;

...

class func fetchMinionData() -> [Minion] {
    let myURL = "https://myurl/test.json"

    let dataURL = NSURL(string: myURL)

    let data = NSData(contentsOfURL: dataURL!, options: NSDataReadingOptions.DataReadingMappedIfSafe, error: nil)
    //THIS IS THE LINE THAT THROWS THE ERROR

    let minionJSON = JSON(data)

    var minions = [Minion]()

    for (_ , minionDictionary) in minionJSON {
        minions.append(Minion(minionDetails: minionDictionary))
    }

    return minions
}

...

请注意,我计划在下载数据后使用SwiftyJSON 库进一步解析数据。我在网上无休止地搜索,但我似乎无法弄清楚这一点!谢谢!

【问题讨论】:

    标签: nsdata nsurl swift2


    【解决方案1】:

    Dictionary 的示例代码 :) Swift 2.0 https://github.com/DaRkD0G/LoadExtension/edit/master/LoadExtensionDictionary.swift

    enum EHError: ErrorType {
        case Nil(String)
        case NSData(String)
        case JSON(String) 
    }
    extension Dictionary {
    
            /**
            Loads a JSON file from the app bundle into a new dictionary
    
            - parameter filename: File name
    
            - throws: PathForResource / NSData / JSON
    
            - returns: Dictionary<String, AnyObject>
            */
            static func loadJSONFromBundle(filename: String) throws ->  Dictionary<String, AnyObject> {
    
                guard let path = NSBundle.mainBundle().pathForResource(filename, ofType: "json")  else {
                    throw EHError.Nil("[EasyHelper][loadJSONFromBundle][->pathForResource] The file could not be located\nFile : '\(filename).json'")
                }
    
                guard let data = try? NSData(contentsOfFile: path, options:NSDataReadingOptions())   else {
                   throw EHError.NSData("[EasyHelper][loadJSONFromBundle][->NSData] The absolute path of the file not find\nFile : '\(filename)'")
                }
    
                guard let jsonDict = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as? Dictionary<String, AnyObject> else {
                    throw EHError.JSON("[EasyHelper][loadJSONFromBundle][->NSJSONSerialization]Error.InvalidJSON Level file '\(filename)' is not valid JSON")
    
    
                }
    
                return jsonDict
    
            }
    }
    

    如果我没有做错,对你来说就是这样

    /**
    Loads a JSON file from the app bundle into a new dictionary
    
    - parameter filename: File name
    
    - throws: EHError : PathForResource / NSData / JSON
    
    - returns: [String : AnyObject] 
    */
    static func loadJSONFromBundle(filename: String, nameJson:String) throws ->  [String : AnyObject] {
    
        guard let path = NSBundle.mainBundle().pathForResource(filename, ofType: "json")  else {
            throw EHError.Nil("[EasyHelper][loadJSONFromBundle][->pathForResource] The file could not be located\nFile : '\(filename).json'")
        }
    
        guard let data = try? NSData(contentsOfFile: path, options:NSDataReadingOptions())   else {
            throw EHError.NSData("[EasyHelper][loadJSONFromBundle][->NSData] The absolute path of the file not find\nFile : '\(filename)'")
        }
    
        guard let jsonDict = try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments) as? [String : AnyObject] else {
            throw EHError.JSON("[EasyHelper][loadJSONFromBundle][->NSJSONSerialization] Invalid JSON\n nameJson '\(nameJson)'\nFile '\(filename)'")
        }
    
    
    
        return jsonDict
    
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 Swift 2,则不应传递最后一个参数“error”。而是尝试一下 NSData 初始化。如果需要在外部访问数据,则将 init 结果放入 var 并转换为 let 修改后的代码

      var optData:NSData? = nil
        do {
          optData = try NSData(contentsOfURL: dataURL!, options: NSDataReadingOptions.DataReadingMappedIfSafe)
        }
        catch {
          print("Handle \(error) here")
        }
      
        if let data = optData {
          // Convert data to JSON here
        }
      

      【讨论】:

      • 嗨@Kedar!感谢您的回复。我实际上已经尝试过了,但是如果面对的问题是 data 然后对于函数的其余部分变得不可访问。因此,如果我在结束 } 之后的下一行是 print(data),我会收到 Use of unresolved identifier 'data'
      • 谢谢@Kedar。在这一点上,我认为我的问题更多的是 SwiftyJSON。如果我打印optData,它会打印一个冗长的编码响应,表明一切正常。如果我在 if let data = optData 闭包中实现let minionJSON = JSON(data),然后尝试print(minionJSON),我会得到unknown
      • 太棒了!仅供参考 Swift 2 将 NSError 作为参数传递并在调用确定成功后读取其值的整个习惯已经改变。对于 Swift 2,所有此类调用通常都会更改为 throws。你必须实现 catch 块来捕获任何错误
      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 2014-12-07
      相关资源
      最近更新 更多