2014-07-01 22 views
12

Tôi đang sử dụng CoreLocation để xác định thành công vị trí của người dùng. Tuy nhiên, khi tôi cố gắng sử dụng phương pháp CLLocationManagerDelegate:Swift: Corelocation xử lý NSError trong didFailWithError

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

Tôi gặp sự cố với thời hạn lỗi.

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

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

Kết quả này trong thông báo lỗi 'Sử dụng thông tin nhận dạng không xác định kCLErrorLocationUnknown'. Tôi biết rằng kCLErrors là enums và họ đã phát triển trong Swift nhưng tôi bị mắc kẹt.

Trả lời

25

Các mã Location lỗi lõi được định nghĩa là

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 
    // ... 
} 

và so sánh giá trị liệt kê với số nguyên err.code, toRaw() thể được sử dụng:

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

Ngoài ra, bạn có thể tạo một CLError từ mã lỗi và kiểm tra xem cho các giá trị có thể có:

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: Trong Xcode 6.1 beta 2, fromRaw()toRaw() phương pháp đã thay thế bằng một init?(rawValue:) initializer và một tài sản rawValue, tương ứng:

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

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

Trong Swift 3 nó bây giờ:

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

Điều này là chính xác. Chỉ trong trường hợp, việc truyền sang NSError có thể sẽ không còn được dùng nữa: 'let code = (lỗi là NSError) .code; nếu code == CLError.denied.rawValue {...} // CODE SMELL !! ' – Rob