swift - 快速检查 NSError 代码

标签 swift core-motion nserror

我正在尝试检查 Swift 中的错误代码值,发现自己对新的结构类型和转换有点困惑。

我想做的只是获取一个传入处理程序闭包的 NSError 对象,并通过将其与存储在 CMError 结构中的值进行比较来检查其代码类型。在 Objective-C 中我会简单地写

[pedometer queryPedometerDataFromDate:now toDate:now withHandler:^(CMPedometerData *pedometerData, NSError *error) {
    BOOL isAuthorized = (error.code != CMErrorMotionActivityNotAuthorized);
}];

在 Swift 中,当我编写我期望的等价内容时

pedometer.queryPedometerDataFromDate(now, toDate: now) {(data:CMPedometerData!, error:NSError!) in
    let isAuthorised:Bool = (error.code != CMErrorMotionActivityNotAuthorized)
}

我收到错误消息找不到接受所提供参数的 '!=' 的重载。这指向类型转换错误。事实上,CMErrorMotionActivityNotAuthorized 属于 CMError 类型,这是一个 Swift 结构。而且我似乎无法在这个 CMError 类型和 error.codeInt 类型之间进行转换。

那么如何检查我的错误代码呢?


注1

如果我尝试分解并显式转换:

let errorCode:Int = (CMErrorMotionActivityNotAuthorized as Int)
let isAuthorized:Bool = (error.code != errorCode)

我收到荒谬的错误消息无法将表达式的类型“Int”转换为类型“Int”


注2

文档说 CMError 定义为

struct CMError {
    init(_ value: CUnsignedInt)
    var value: CUnsignedInt
}

在 swift 。在 Objective-C 中它被定义为

typedef enum {
   CMErrorNULL = 100,
   CMErrorDeviceRequiresMovement,
   CMErrorTrueNorthNotAvailable,
   CMErrorUnknown,
   CMErrorMotionActivityNotAvailable,
   CMErrorMotionActivityNotAuthorized,
   CMErrorMotionActivityNotEntitled,
   CMErrorInvalidParameter
} CMError;

最佳答案

Jack Wu 的评论是正确的 — 这看起来像一个非现代化的枚举,并且 filing a bug about that会是个好主意。同时...

按住 Command 并单击 Swift 文件中的 CMError 声明,您将获得类型和相关常量的 Swift 定义。 CMErrorMotionActivityNotAuthorized 和 friends 不是 Int 的子类型,它们是 CMError 结构的实例,它包含一个整数 value。该值是一个 CUnsignedInt,Swift 不会自动将其转换为带符号的 Int 为您 — Swift 作为“安全”语言的一部分是避免隐式类型的情况转换可能导致上溢/下溢,从而导致 bugs .

因此,您的查询应如下所示:

pedometer.queryPedometerDataFromDate(now, toDate: now) { data, error in
    let isAuthorized = (error.code != Int(CMErrorMotionActivityNotAuthorized.value))
}

(还精简了代码以使用类型推断。)

关于swift - 快速检查 NSError 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24329394/

相关文章:

swift - 如何创建一个排除下限而不是上限的 HalfOpenInterval

ios - 如何使用 CMMotionActivityManager 并接收更新?

ios - 加速度计 didAccelerate 委托(delegate)方法在 iOS sdk 6.0 中没有被调用

ios - Cocoa/iOS 错误处理风格,没有 NSError

objective-c - 处理 NSError 时理解 'potential null dereference'

ios - 在 iOS 中使用 NSMutableAttributedString 作为常量

ios - Swift 5 NumberPad 扩展按钮无响应

ios - 变量的值在 observeSingleEvent 中没有改变

ios - 使用设备旋转上的 Core Motion 旋转 View

ios - 返回 bool 的方法中的错误/异常处理