如何将 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 错误号进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何将 swift 文件与 SKscene 连接?

如何将 SCNFloor 的属性与 Swift 和 Scenekit 一起使用?

如何将 TestFlight 与 Swift 1.2 应用程序一起使用?

如何将 FMDB 与 cocoapods 和 swift 一起使用?

Swift:如何将 for-in 循环与可选参数一起使用?

如何通过 iOS(swift)将 Firebase Auth 与 MySQL DB 同步?