在 Swift 中,Objective-C BOOL 被推断为 `()` 而不是 Bool

Posted

技术标签:

【中文标题】在 Swift 中,Objective-C BOOL 被推断为 `()` 而不是 Bool【英文标题】:In Swift, an Objective-C BOOL inferred as `()` instead of Bool 【发布时间】:2021-08-19 19:28:59 【问题描述】:

我有一个用 Objective-C 编写的方法,它返回一个 BOOL,例如:

 (BOOL)methodName:(NSDictionary<NSString *, NSString *> *)params callback:(void(^)(NSString *_Nullable, ErrorInformation *_Nullable))callback error:(NSError *_Nullable *_Nullable)errorPtr;

在 Swift 中的使用

我得到了错误,Cannot convert value of type '()' to expected condition type 'Bool'。我认为ret 的类型是(),而不是BOOL。查看实现,这个值在 dispatch_sync 内部发生了变异。

let ret = try! methodName()
// I've tried a bunch of different syntaxes below:
if (ret)  <--- Xcode warning: Cannot convert value of type '()' to expected condition type 'Bool'



看到这个方法有3种指示失败的方式不太好,但我没有设计它????坦率地说,我的 Objective-C 并不好:

errorPtr,在 Swift 中会自动变成do/try/catch ErrorInformation 传入回调 BOOL 返回值,我正在努力解决。

【问题讨论】:

相关:***.com/q/34786115/1187415 【参考方案1】:

返回的BOOLNSError 处理的一部分,它在Swift 中被转换为throws 函数(如果该方法返回一个值,Swift 会将其从nullable 转换为nonnull)。

方法成功返回YES(无错误),方法失败返回NO

在斯威夫特中:

do 
   try methodName()
   // method succeeded
 catch 
  // method failed

回调中的ErrorInformation可能与异步错误有关,可能类似于Swift中的Result&lt;String, Error&gt;

参考资料:

    Handling Error Objects Returned From Methods (Obj-C) Improved NSError Bridging (Swift Evolution 0112)

【讨论】:

谢谢! ? 你能告诉我NSError 处理的文档吗?我想了解为什么在 Objective-C 中 API 会同时具有 ret(BOOL 返回值)和 nsError 指针。 @BenButterworth 添加了参考 :) 简而言之,您可以使用返回值来快速检查成功/失败,如果您想知道确切的错误,您可以使用 error 参数。您可以将NULL 传递给错误参数。 “为什么在 Objective-C 中,API 会同时具有 ret(BOOL 返回值)和 nsError 指针”因为成功时指针可能不为零。因此,在 Objective C 中,您首先查看 Bool,如果为 NO,则查看错误。这很棘手。重点是 Swift 为你包装了它。

以上是关于在 Swift 中,Objective-C BOOL 被推断为 `()` 而不是 Bool的主要内容,如果未能解决你的问题,请参考以下文章

swift项目中swift和objective-C之间的双向通信

swift项目中swift和objective-C之间的双向通信

在 Objective-C 代码中使用 Swift 的缺点?

在 Objective-C 代码中使用 Swift 的缺点?

在 Swift 中使用 Objective-C 扩展类

在 Swift 中使用 Objective-C 枚举