首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查NSError代码

检查NSError代码
EN

Stack Overflow用户
提问于 2014-06-20 14:17:35
回答 2查看 3.6K关注 0票数 8

我试图检查Swift中的错误代码值,并发现自己被新的结构类型和转换弄糊涂了。

我想做的只是简单地接受一个在处理程序闭包中传递的NSError对象,并通过将它与存储在CMError结构中的值进行比较来检查它的代码类型。在目标C中,我会简单地写

代码语言:javascript
复制
[pedometer queryPedometerDataFromDate:now toDate:now withHandler:^(CMPedometerData *pedometerData, NSError *error) {
    BOOL isAuthorized = (error.code != CMErrorMotionActivityNotAuthorized);
}];

在斯威夫特里,当我写我期望的等价物时

代码语言:javascript
复制
pedometer.queryPedometerDataFromDate(now, toDate: now) {(data:CMPedometerData!, error:NSError!) in
    let isAuthorised:Bool = (error.code != CMErrorMotionActivityNotAuthorized)
}

我得到错误找不到接受所提供的参数的'!=‘的重载。这指向类型强制转换错误。实际上,CMErrorMotionActivityNotAuthorizedCMError类型的,它是一个Swift结构。我似乎无法在这个CMError类型和Int类型(也就是error.code类型)之间进行转换。

那么如何检查我的错误代码呢?

注1

如果我试图分解并显式转换:

代码语言:javascript
复制
let errorCode:Int = (CMErrorMotionActivityNotAuthorized as Int)
let isAuthorized:Bool = (error.code != errorCode)

我得到荒谬的错误消息不能将表达式的类型'Int‘转换为键入'Int’。

注2

文档显示CMError被定义为

代码语言:javascript
复制
struct CMError {
    init(_ value: CUnsignedInt)
    var value: CUnsignedInt
}

在斯威夫特。在目标C中,它被定义为

代码语言:javascript
复制
typedef enum {
   CMErrorNULL = 100,
   CMErrorDeviceRequiresMovement,
   CMErrorTrueNorthNotAvailable,
   CMErrorUnknown,
   CMErrorMotionActivityNotAvailable,
   CMErrorMotionActivityNotAuthorized,
   CMErrorMotionActivityNotEntitled,
   CMErrorInvalidParameter
} CMError;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-20 18:03:04

杰克·吴的评论是对的--这看起来像是一个非现代化的枚举,而在这件事上提出了一个错误将是一个好主意。同时..。

命令-单击Swift文件中的CMError声明,您将得到Swift类型和相关常量的Swift定义。CMErrorMotionActivityNotAuthorized和朋友不是Int的子类型,它们是包含整数valueCMError结构的实例。该值是一个CUnsignedInt,Swift不会自动为您将其转换为一个签名的Int -- Swift作为一种“安全”语言的一部分是避免出现隐式类型转换可能导致导致错误的过度/溢出的情况。

因此,您的查询应该如下所示:

代码语言:javascript
复制
pedometer.queryPedometerDataFromDate(now, toDate: now) { data, error in
    let isAuthorized = (error.code != Int(CMErrorMotionActivityNotAuthorized.value))
}

(还对代码进行了一些细化,以使用类型推断。)

票数 7
EN

Stack Overflow用户

发布于 2017-11-01 19:27:31

Swift 4.0中,您可以选择使用CMPedometer.authorizationStatus(),这会使您的生活变得更容易一些:)下面是我要做的事情,首先检查一下版本,如果是iOS 11+,我们可以使用这个方法,否则我们使用错误解析方法:

代码语言:javascript
复制
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
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24329394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档