Sto cercando di implementare i requisiti del protocollo CLLocationManagerDelegate
tramite un'estensione di protocollo, ma il gestore di posizione non lo vede nell'estensione del protocollo e non riesce. Tuttavia, funziona con lo stesso codice quando viene spostato nella classe.Le estensioni del protocollo non possono soddisfare la conformità CLLocationManagerDelegate?
Ecco quello che sto facendo:
class ViewController: UIViewController, MyLocationProtocol {
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
locationManager.distanceFilter = 1000.0
locationManager.delegate = self
// Below crashes when implementation in protocol extension
locationManager.requestLocation()
}
}
protocol MyLocationProtocol: CLLocationManagerDelegate {
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
}
extension MyLocationProtocol /*where Self: UIViewControll*/ { // Tried using where clause but still no go :(
// Not being triggered by CLLocationManagerDelegate! :(
// Move to ViewController class and error goes away
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("MyLocationProtocol: locationManager: didUpdateLocations")
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("MyLocationProtocol: locationManager: didFailWithError")
}
}
del bando nella extension MyLocationProtocol
sto mettendo le didUpdateLocations
e didFailWithError
implementazioni lì. Non ottengono mai il grilletto e in realtà si bloccano dicendo: 'Delegate must respond to locationManager:didUpdateLocations:'
. Se cambio lo stesso codice didUpdateLocations
e didFailWithError
in ViewController
, tutto funziona come previsto.
C'è qualcosa che mi manca sul motivo per cui questo non funziona attraverso le estensioni del protocollo? La classe viene riconosciuta come uguale a CLLocationManagerDelegate
, altrimenti non riuscirà a locationManager.delegate = self
. Qualche idea su come fare questo lavoro o c'è un bug da qualche parte?
da dove proviene la funzione requestLocation()? – user3441734
Una nuova API iOS 9. – TruMan1