我试图检查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
之间进行转换。
那我该怎么检查我的错误代码呢?
如果我尝试分解并明确施放:
let errorCode:Int = (CMErrorMotionActivityNotAuthorized as Int)
let isAuthorized:Bool = (error.code != errorCode)
我收到了荒谬的错误消息无法转换表达式' Int'输入' Int' 。
文件称CMError
定义为
struct CMError {
init(_ value: CUnsignedInt)
var value: CUnsignedInt
}
在斯威夫特。在Objective-C中,它被定义为
typedef enum {
CMErrorNULL = 100,
CMErrorDeviceRequiresMovement,
CMErrorTrueNorthNotAvailable,
CMErrorUnknown,
CMErrorMotionActivityNotAvailable,
CMErrorMotionActivityNotAuthorized,
CMErrorMotionActivityNotEntitled,
CMErrorInvalidParameter
} CMError;
答案 0 :(得分:7)
Jack Wu的评论是正确的 - 这看起来像一个非现代化的枚举,而filing a bug about that将是一个好主意。在此期间......
按顺序单击Swift文件中的CMError
声明,您将获得类型和相关常量的Swift定义。 CMErrorMotionActivityNotAuthorized
和朋友不是Int
的子类型,它们是CMError
结构的实例,其中包含整数value
。该值为CUnsignedInt
,并且Swift不会自动将其转换为签名的Int
- Swift作为“安全”语言的一部分是避免隐式类型转换可能导致结束的情况导致bugs的下溢。
因此,您的查询应如下所示:
pedometer.queryPedometerDataFromDate(now, toDate: now) { data, error in
let isAuthorized = (error.code != Int(CMErrorMotionActivityNotAuthorized.value))
}
(还使用类型推断稍微修改了代码。)
答案 1 :(得分:0)
在 Swift 4.0 中你可以选择CMPedometer.authorizationStatus()
,让你的生活更轻松:)
这是我要做的,首先检查版本是否 iOS 11 + ,我们可以使用此方法,否则我们使用错误解析方法:
CMPedometer().queryPedometerData(from: Date(), to: Date()) { (_, error) in
let isAuthorised: Bool = {
if #available(iOS 11.0, *) {
return CMPedometer.authorizationStatus() == .authorized
} else {
if let error = error as NSError? {
return error.code != Int(CMErrorMotionActivityNotAuthorized.rawValue)
} else { return true }
}
}()
if isAuthorised {
// do your stuff
}
}