【发布时间】:2014-08-11 08:05:17
【问题描述】:
我正在尝试检查 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 类型和Int 类型之间转换,即error.code。
那么如何检查我的错误代码?
注 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
}
在斯威夫特。在 Objective-C 中它被定义为
typedef enum {
CMErrorNULL = 100,
CMErrorDeviceRequiresMovement,
CMErrorTrueNorthNotAvailable,
CMErrorUnknown,
CMErrorMotionActivityNotAvailable,
CMErrorMotionActivityNotAuthorized,
CMErrorMotionActivityNotEntitled,
CMErrorInvalidParameter
} CMError;
【问题讨论】:
-
既然是 ObjC 中的
enum,你试过CMError.MotionActivityNotAuthorized吗? -
我试过了。它说 'CMError.Type' 没有名为 'MotionActivityNotAuthorized' 的成员。
-
在我看来,由于他们没有使用
NS_ENUM来“现代化”他们的 ObjC 枚举,因此 objc->swift 翻译器没有正确翻译枚举并以struct结束...可能值得报告错误,除非有人弄清楚原因 -
是的,我也怀疑有错误,但我认为更可能是我错过了一些东西。如果没有人弄清楚出了什么问题,我会提交一份错误报告,提供这个问题作为参考。
-
我查看了 iOS 8 API 差异,CMError 不在核心运动部分,似乎核心运动团队很懒惰或不知道 swift :p
标签: swift core-motion nserror