2014-07-01 9 views
12

Ich benutze CoreLocation, um den Standort des Benutzers erfolgreich zu bestimmen. Jedoch wenn ich versuche, die CLLocationManagerDelegate Methode zu verwenden:Swift: Corelocation-Behandlung NSError in DidFailWithError

func locationManager(_ manager: CLLocationManager!, didFailWithError error: NSError!) 

Ich betreibe Probleme mit dem Fehlerterm.

func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { 
    println("didFailWithError \(error)") 

    if let err = error { 
     if err.code == kCLErrorLocationUnknown { 
      return 
     } 
    } 
} 

Dies führt zu einer ‚Verwendung von ungelöstem Identifikator kCLErrorLocationUnknown‘ Fehlermeldung. Ich weiß, dass die kCLErrors enums sind und dass sie sich in Swift entwickelt haben, aber ich stecke fest.

Antwort

25

der Kern Location Fehlercodes als

definiert sind
enum CLError : Int { 
    case LocationUnknown // location is currently unknown, but CL will keep trying 
    case Denied // Access to location or ranging has been denied by the user 
    // ... 
} 

und den Aufzählungswert mit der ganzen Zahl err.code, toRaw() kann verwendet werden, zu vergleichen:

if err.code == CLError.LocationUnknown.toRaw() { ... 

Alternativ können Sie auch eine CLError erstellen aus dem Fehlercode und überprüfen, dass für die möglichen Werte:

if let clErr = CLError.fromRaw(err.code) { 
    switch clErr { 
    case .LocationUnknown: 
     println("location unknown") 
    case .Denied: 
     println("denied") 
    default: 
     println("unknown Core Location error") 
    } 
} else { 
    println("other error") 
} 

UPDATE: In Xcode 6.1 Beta 2, die fromRaw() und toRaw() Methoden durch einen init?(rawValue:) initializer und rawValue Eigenschaft ersetzt worden ist, beziehungsweise:

if err.code == CLError.LocationUnknown.rawValue { ... } 

if let clErr = CLError(rawValue: code) { ... } 
6

In Swift 3 ist es jetzt:

if error._code == CLError.denied.rawValue { ... } 
+0

Das ist richtig. Nur für den Fall, Casting zu NSError wird wahrscheinlich bald veraltet sein: 'let code = (Fehler als NSError) .code; wenn code == CLError.denied.rawValue {...} // CODE SMELL !! ' – Rob