问题让 NSData 请求在 Swift 2.0 中工作

Issue Getting NSData Request To Work In Swift 2.0

我希望有人可以帮助我解决我在 Swift 2.0 中尝试编写(或学习编写)的应用程序时遇到的问题。这以前在 Swift 1.2 中有效,但在必要的转换之后,我不断面临错误;

无法使用类型为“(contenOfURL: NSURL, options: NSDataReadingOptions, error:nil)”[= 的参数列表调用类型 'NSData' 的初始值设定项13=]

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

...

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 库进一步解析数据。我在网上无休止地搜索,但我似乎无法弄清楚!谢谢!

如果您正在使用 Swift 2,则不应传递最后一个参数 "error"。而是尝试围绕 NSData 初始化。如果需要在外部访问数据,则将初始化结果放入 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
  }

字典示例代码:) 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

}