我试图检查Swift中的错误代码值,并发现自己被新的结构类型和转换弄糊涂了。
我想做的只是简单地接受一个在处理程序闭包中传递的NSError对象,并通过将它与存储在CMError结构中的值进行比较来检查它的代码类型。在目标C中,我会简单地写
[pedometer queryPedometerDataFromDate:now toDate:now withHandler:^(CMPedometerData *pedometerData, NSError *error) {
BOOL isAuthorized = (error.code != CMErrorMotionActivityNotAuthorized);
}];在斯威夫特里,当我写我期望的等价物时
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
}在斯威夫特。在目标C中,它被定义为
typedef enum {
CMErrorNULL = 100,
CMErrorDeviceRequiresMovement,
CMErrorTrueNorthNotAvailable,
CMErrorUnknown,
CMErrorMotionActivityNotAvailable,
CMErrorMotionActivityNotAuthorized,
CMErrorMotionActivityNotEntitled,
CMErrorInvalidParameter
} CMError;发布于 2014-06-20 18:03:04
杰克·吴的评论是对的--这看起来像是一个非现代化的枚举,而在这件事上提出了一个错误将是一个好主意。同时..。
命令-单击Swift文件中的CMError声明,您将得到Swift类型和相关常量的Swift定义。CMErrorMotionActivityNotAuthorized和朋友不是Int的子类型,它们是包含整数value的CMError结构的实例。该值是一个CUnsignedInt,Swift不会自动为您将其转换为一个签名的Int -- Swift作为一种“安全”语言的一部分是避免出现隐式类型转换可能导致导致错误的过度/溢出的情况。
因此,您的查询应该如下所示:
pedometer.queryPedometerDataFromDate(now, toDate: now) { data, error in
let isAuthorized = (error.code != Int(CMErrorMotionActivityNotAuthorized.value))
}(还对代码进行了一些细化,以使用类型推断。)
发布于 2017-11-01 19:27:31
在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
}
}https://stackoverflow.com/questions/24329394
复制相似问题