我正在尝试检查 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.code
的 Int
类型之间进行转换。
那么如何检查我的错误代码呢?
注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/