2015-07-01 23 views
0

我在地圖中的幾個位置反轉地理代碼,我想將它包裝到一些常用方法。我所擁有的是以此爲出發點的工作原理:回調,具有多個參數的快速完成處理程序

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark) -> Void) { 
    let geocoder = CLGeocoder() 

    geocoder.reverseGeocodeLocation(location) { 
     (placemarks, error) -> Void in 

     // Check for returned placemarks 
     if let placemarks = placemarks where placemarks.count > 0 { 
      let topResult = placemarks[0] as! CLPlacemark 

      completion(topResult) 
     } 
    } 
} 

但是,如果我想添加其他參數我完成方法,將錯誤返回到我的觀點,像這樣:

func reverseGeocodeLocation(location: CLLocation, completion: (CLPlacemark, NSError) -> Void) { 
    let geocoder = CLGeocoder() 

    geocoder.reverseGeocodeLocation(location) { 
     (placemarks, error) -> Void in 

     // Check for returned placemarks 
     if let placemarks = placemarks where placemarks.count > 0 { 
      let topResult = placemarks[0] as! CLPlacemark 

      completion(topResult, error) 
     } 
    } 
} 

如果錯誤是nil,那麼我的completion(topResult, error)將失敗,因爲錯誤是零,並且訪問不良。但我不能這樣做,因爲參數不匹配完成處理程序。

if error != nil { 
    completion(topResult) 
} else { 
    completion(...) // do something with the error 
} 

所以,如果我有一個零錯誤,我將如何調用我的完成處理程序?謝謝。

+0

我認爲錯誤應該是可選的在這種情況下?什麼是geocoder.reverseGeocodeLocation方法的完整簽名? – Shripada

回答

0

由於您自己定義了完成標題,您可以使用可選的NSError?來定義它,因此它不會導致錯誤並需要解包。此外近期CLGeocodeCompletionHandler的定義也使用可選陣列和錯誤:

typealias CLGeocodeCompletionHandler = ([CLPlacemark]?, NSError?) -> Void 
+0

如果沒有錯誤,我是否還需要這樣做:'completion(topResult,nil)' – Crystal

+0

是的,NSError?允許你通過零沒有問題 –