2017-05-30 5 views
0

私はフォローしようとしていますRay Wenderlichのウェブサイトから、Instrumentsを使用する方法を学ぶためのチュートリアルです。サンプルコードはSwift 2と書かれています。実行する前に、最新のSwiftバージョンにコードを移行する必要があります。私は、変換エラーによるハーフウェイを得ているが、私は次のコード領域に困惑:私は「'(_、_、_)型のスロー関数から非スロー関数型'(URLResponse ?, Data ?, Error?) - > Voidにスローされる変換が無効です

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

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)! 
    } 


} 

が、私は次のコード行でエラーが出ます私はこれをどのように修正するべきなのか、ちょっと混乱しています。試してキャッチすれば、どんな助けでも分かりますので、アプリケーションを実行して楽器で遊ぶことができます。ここで

は、チュートリアルへのリンクです:https://www.raywenderlich.com/97886/instruments-tutorial-with-swift-getting-started

+1

問題は、エラーをスローすることができる '試行 'があるが、それをキャッチしていないということです。したがって、クロージャがエラーをスローする必要があると仮定しています。クロージャで 'try'で投げたエラーを' do'-'catch'するか、エラーを投げない' 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を返します。

関連する問題