在 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】:返回的BOOL
是NSError
处理的一部分,它在Swift 中被转换为throws
函数(如果该方法返回一个值,Swift 会将其从nullable
转换为nonnull
)。
方法成功返回YES
(无错误),方法失败返回NO
。
在斯威夫特中:
do
try methodName()
// method succeeded
catch
// method failed
回调中的ErrorInformation
可能与异步错误有关,可能类似于Swift中的Result<String, Error>
。
参考资料:
-
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 的缺点?