我正在使用CoreLocation成功确定用户的位置。但是,当我尝试使用CLLocationManagerDelegate方法时:
func locationManager(_ manager: CLLocationManager!, didFailWithError error: NSError!)
我遇到了错误术语的问题。
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) { println("didFailWithError \(error)") if let err = error { if err.code == kCLErrorLocationUnknown { return } } }
这将导致出现“使用未解决的标识符kCLErrorLocationUnknown”错误消息。我知道kCLErrors是枚举,并且它们已经在Swift中发展了,但我陷入了困境。
Swift 4更新: 错误现在传递给回调error: Error,可以将其转换为CLError:
error: Error
CLError
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { if let clErr = error as? CLError { switch clErr { case CLError.locationUnknown: print("location unknown") case CLError.denied: print("denied") default: print("other Core Location error") } } else { print("other error:", error.localizedDescription) } }
较旧的答案: 核心位置错误代码定义为
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 // ... }
并将枚举值与整数进行比较err.code,toRaw() 可以使用:
err.code
toRaw()
if err.code == CLError.LocationUnknown.toRaw() { ...
或者,您可以CLError根据错误代码创建一个,然后检查是否有可能的值:
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") }
更新: 在Xcode 6.1 beta 2中,fromRaw()和toRaw()方法分别被init?(rawValue:)初始化器和rawValue属性代替:
fromRaw()
init?(rawValue:)
rawValue
if err.code == CLError.LocationUnknown.rawValue { ... } if let clErr = CLError(rawValue: code) { ... }