【问题标题】:Swift: Corelocation handling NSError in didFailWithErrorSwift:Corelocation 在 didFailWithError 中处理 NSError
【发布时间】:2014-08-21 23:24:35
【问题描述】:

我正在使用 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 ios8 nserror didfailwitherror


    【解决方案1】:

    Swift 4 更新:错误现在以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.codetoRaw()进行比较 可以使用:

    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 属性:

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

    【讨论】:

      【解决方案2】:

      现在是 Swift 3:

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

      【讨论】:

      • 这是正确的。以防万一,转换为 NSError 可能很快就会被弃用:let code = (error as NSError).code; if code == CLError.denied.rawValue { ... } // CODE SMELL!!
      【解决方案3】:

      斯威夫特 4.1:

      func locationManager(_: CLLocationManager, didFailWithError error: Error) {
          let err = CLError.Code(rawValue: (error as NSError).code)!
          switch err {
          case .locationUnknown:
              break
          default:
              print(err)
          }
      }
      

      【讨论】:

      • 这行得通。我发现了另一个没有使用 NSError 的变体。
      • 哪一个!? :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 2014-01-26
      • 2014-10-17
      • 1970-01-01
      相关资源
      最近更新 更多