检查swift中的NSError代码

时间:2014-06-20 14:17:36

标签: 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类型和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;

2 个答案:

答案 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
    }

}