2015-07-01 2 views
0

Я меняю геокод в нескольких местах на моей карте, и я хотел обернуть его некоторым распространенным методом. Что у меня есть это в качестве отправной точки, которая работает:обратные вызовы, обработчик завершения с несколькими параметрами в swift

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 
} 

Итак, если у меня есть ошибка nil, как я могу назвать обработчик завершения? Благодарю.

+0

Я думаю, что ошибка должна быть необязательной в этом случае? Также какова полная подпись метода geocoder.reverseGeocodeLocation? – Shripada

ответ

0

Поскольку у вас есть определение вашего заголовка завершения, вы можете определить его обычно с помощью необязательного NSError?. Поэтому он не вызовет ошибок и потребует разворачивания. Кроме того недавнее определение CLGeocodeCompletionHandler также использует дополнительный массив и ошибку:

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

Не было бы все равно сделать это, если бы не было ошибки: 'complete (topResult, nil)' – Crystal

+0

Да, NSError? Позволяет передавать ноль без проблем –

Смежные вопросы