2017-05-30 47 views
0

我试图关注Ray Wenderlich网站的一个教程,用于学习使用仪器。示例代码的编写是Swift 2,我相信在我被允许运行它之前,我必须将代码迁移到最新的Swift版本。我已经通过了转换错误得到一半的方式,但我难倒下面的代码区:从'(_,_,_)类型的抛出函数向抛出函数类型'抛出函数类型'(URLResponse?,Data ?, Error?)无效转换 - >无效

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,所以任何帮助都会被赞赏,所以我可以运行app来玩弄Instruments。

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

+1

问题是你有'try'可以抛出错误,但是你没有捕获它,所以它假设闭包因此需要抛出错误,而不是。只需''''''''''可以在闭包中使用'try'抛出的错误或者使用'try?',它不会抛出错误。 – Rob

回答

1

这个替换您的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。

相关问题