繁体   English   中英

从类型为((_,_,_)的throwing函数->()到无效类型为'(URLResponse ?, Data ?, Error?)-> Void的无效转换

[英]Invalid conversion from throwing function of type '(_, _, _) throws -> ()' to non-throwing function type '(URLResponse?, Data?, Error?) -> Void

我试图遵循Ray Wenderlich网站上的教程来学习如何使用乐器。 我相信示例代码是用Swift 2编写的,因此在允许运行它之前,我必须将代码迁移到最新的Swift版本。 我已经经历了转换错误的一半,但是我陷入了以下代码区域:

class Flickr {

  let processingQueue = OperationQueue()

  func searchFlickrForTerm(_ searchTerm: String, completion : @escaping (_ results: FlickrSearchResults?, _ error : NSError?) -> Void){

    let searchURL = flickrSearchURLForSearchTerm(searchTerm)
    let searchRequest = URLRequest(url: searchURL)

    NSURLConnection.sendAsynchronousRequest(searchRequest, queue: processingQueue) {response, data, error in
      if error != nil {
        completion(nil,error as! NSError)
        return
      }

      var JSONError : NSError?


        let resultsDictionary = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary

      if JSONError != nil {
        completion(nil, JSONError)
        return
      }

      switch (resultsDictionary!["stat"] as! String) {
      case "ok":
        print("Results processed OK")
      case "fail":
        let APIError = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:resultsDictionary!["message"]!])
        completion(results: nil, error: APIError)
        return
      default:
        let APIError = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:"Unknown API response"])
        completion(nil, APIError)
        return
      }

      let photosContainer = resultsDictionary!["photos"] as! NSDictionary
      let photosReceived = photosContainer["photo"] as! [NSDictionary]

      let flickrPhotos : [FlickrPhoto] = photosReceived.map {
        photoDictionary in

        let photoID = photoDictionary["id"] as? String ?? ""
        let title = photoDictionary["title"] as? String ?? ""
        let farm = photoDictionary["farm"] as? Int ?? 0
        let server = photoDictionary["server"] as? String ?? ""
        let secret = photoDictionary["secret"] as? String ?? ""

        let flickrPhoto = FlickrPhoto(photoID: photoID, title: title, farm: farm, server: server, secret: secret)

        return flickrPhoto
      }

      DispatchQueue.main.async(execute: {
        completion(FlickrSearchResults(searchTerm: searchTerm, searchResults: flickrPhotos), nil)
      })
    }
  }

  fileprivate func flickrSearchURLForSearchTerm(_ searchTerm:String) -> URL {
    let escapedTerm = searchTerm.addingPercentEscapes(using: String.Encoding.utf8)!
    let URLString = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=\(apiKey)&text=\(escapedTerm)&per_page=30&format=json&nojsoncallback=1"
    return URL(string: URLString)!
  }


}

我在以下代码行中收到错误:

NSURLConnection.sendAsynchronousRequest(searchRequest, queue: processingQueue) {response, data, error in
      if error != nil {
        completion(nil,error as! NSError)
        return
      }

我对应该如何使用do,try,catch进行修改感到有些困惑,因此将不胜感激,以便我可以使该应用程序与Instruments一起运行。

这是教程的链接: https : //www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

以此替换您的Flickr类。

class Flickr {

  let processingQueue = OperationQueue()

  func searchFlickrForTerm(_ searchTerm: String, completion : @escaping (_ results: FlickrSearchResults?, _ error : NSError?) -> Void){

let searchURL = flickrSearchURLForSearchTerm(searchTerm)
let searchRequest = URLRequest(url: searchURL)

NSURLConnection.sendAsynchronousRequest(searchRequest, queue: processingQueue) {response, data, error in
    guard let data = data, error == nil else {
        completion(nil, error as NSError?)
        return
    }

    guard let jsonObject = try? JSONSerialization.jsonObject(with: data,
                                                                    options: JSONSerialization.ReadingOptions(rawValue: 0)),
    let resultsDictionary = jsonObject as? Dictionary<String, Any>
        else
    {
        return
    }


    switch (resultsDictionary["stat"] as! String) {
    case "ok":
        print("Results processed OK")
    case "fail":
        let APIError = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:resultsDictionary["message"]!])
        completion(nil, APIError)
        return
    default:
        let APIError = NSError(domain: "FlickrSearch", code: 0, userInfo: [NSLocalizedFailureReasonErrorKey:"Unknown API response"])
        completion(nil, APIError)
        return
    }

    let photosContainer = resultsDictionary["photos"] as! NSDictionary
    let photosReceived = photosContainer["photo"] as! [NSDictionary]

    let flickrPhotos : [FlickrPhoto] = photosReceived.map {
        photoDictionary in

        let photoID = photoDictionary["id"] as? String ?? ""
        let title = photoDictionary["title"] as? String ?? ""
        let farm = photoDictionary["farm"] as? Int ?? 0
        let server = photoDictionary["server"] as? String ?? ""
        let secret = photoDictionary["secret"] as? String ?? ""

        let flickrPhoto = FlickrPhoto(photoID: photoID, title: title, farm: farm, server: server, secret: secret)

        return flickrPhoto
    }

    DispatchQueue.main.async(execute: {
        completion(FlickrSearchResults(searchTerm: searchTerm, searchResults: flickrPhotos), nil)
    })
}
  }

  fileprivate func flickrSearchURLForSearchTerm(_ searchTerm:String) -> URL {
let escapedTerm = searchTerm.addingPercentEscapes(using: String.Encoding.utf8)!
let URLString = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=\(apiKey)&text=\(escapedTerm)&per_page=30&format=json&nojsoncallback=1"
return URL(string: URLString)!
  }


}

抱歉,所有空格都弄乱了,但问题是您没有正确执行错误处理。 当您执行JSONSerialization时,它可能会抛出,因此您必须将其包装在do catch块中,或者可以使用! 忽略抛出并崩溃(如果抛出错误)? 如果失败则返回nil。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM