如何将 NSError.code 与 Swift 5 中的#defined 错误号进行比较
Posted
技术标签:
【中文标题】如何将 NSError.code 与 Swift 5 中的#defined 错误号进行比较【英文标题】:How to compare NSError.code to #defined error number in Swift 5 【发布时间】:2019-07-10 12:28:18 【问题描述】:我知道我已经使用 Objective-C 几年了,但我对 Swift 还是很陌生。
目前,我正在努力将一些新的基于 Swift 5 的代码添加到现有的 Objective-C 项目中,该项目使用定义的错误代码常量和 NSError
对象来传播错误。
如何在 Swift 中使用NSError.code
?
Obective-C 代码:
#define someStrangeError_Code 1000
typedef void(^CompletionHandler)(BOOL success, NSError *error);
...
- (void)doSomethingAsync:(CompletionHandler)completion
// ... do something
if (errorOccured)
completion(false, [NSError errorWithDomain:@"MyErrorDomain" code:someStrangeError_Code userInfo:nil])
else
completion(true, nil)
...
[someObjc doSomethingAsync:^(BOOL success, NSError *error)
if (error != nil && error.code == someStrangeError_Code)
....
];
Swift 代码:
someObjc.doSomethingAsync(completion: (success, error) in
if ((error as NSError?)?.code == someStrangeError_Code)
// ERROR
// Binary operator '==' cannot be applied to operands of type 'Int?' and 'Int32'
)
我知道 Swift 使用 Error
协议而不是 NSError
。但是,NSError
符合 Error
,因此使用 NSError
应该没有问题,不是吗?
将一个简单的错误代码与一个常量进行比较应该不难,但我无法解决这个问题。
那么什么是正确的“Swift方式”来检查错误代码并避免
二元运算符“==”不能应用于“Int?”类型的操作数和'Int32'
【问题讨论】:
即使没有发生错误,回调是否总是出现错误? 如果没有发生错误,则使用error = nil
调用闭包
【参考方案1】:
C 整数作为Int32
导入到Swift,不能直接与可选的Int?
进行比较。转换有帮助:
if ((error as NSError?)?.code == Int(someStrangeError_Code))
// some strange error
或者,首先打开可选错误:
if let error = error
if (error as NSError).code == someStrangeError_Code
// some strange error
else
// some other error
else
// no error
另一个选择是将 (Objective-)C 定义更改为
#define someStrangeError_Code 1000L
对于long int
常量,它作为Int
导入到Swift。然后你的原始 Swift 代码将再次编译。
【讨论】:
不应该as NSError?
是 as? NSError
吗?
@rmaddy:您始终可以将Error
转换为NSError
,因此将Error?
转换为NSError?
。但这可能不会有什么不同。
@rmaddy:error as? NSError
给出编译器警告“来自'错误的条件向下转换?'到 'NSError' 是一个桥接转换;你的意思是用'as'吗?”使用修复它“替换为? NSError' 与 'as NSError?'”以上是关于如何将 NSError.code 与 Swift 5 中的#defined 错误号进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SCNFloor 的属性与 Swift 和 Scenekit 一起使用?
如何将 TestFlight 与 Swift 1.2 应用程序一起使用?