繁体   English   中英

NS_REFINED_FOR_SWIFT并返回值

[英]NS_REFINED_FOR_SWIFT and return value

我是Swift的新手,我开始探索一些与Objective-C进行桥接的功能。

目前我有一个NSError引用的方法,它是:

- (BOOL) verifyPersonalizationWithError:(NSError **) error NS_REFINED_FOR_SWIFT;

现在我可以在Swift中访问该方法进行一些改进,但返回值会丢失。 Swift生成的方法是:

open func __verifyPersonalization() throws

使用do catch正确处理错误但返回值似乎丢失了。

我的NS_REFINED_FOR_SWIFT宏有什么遗漏的东西?

这与NS_REFINED_FOR_SWIFT宏无关。 Objective-C方法

 - (BOOL) verifyPersonalizationWithError:(NSError **) error;

被导入到Swift中

open func verifyPersonalization() throws

并且NS_REFINED_FOR_SWIFT宏的唯一作用是将下划线添加到Swift方法名称

open func __verifyPersonalization() throws

它允许在扩展中提供精炼的Swift接口,同时保持原始实现可从精炼接口调用(参见同一项目中的Swift和Objective-C中的 “精炼Objective-C声明”)。

Swift导入器假定Objective-C方法的布尔返回值表示成功或失败,这是使用和创建错误对象中记录的常见Cocoa模式:

重要说明:方法的返回值表示成功或失败。 虽然在Cocoa错误域中间接返回错误对象的Cocoa方法可以保证返回这样的对象,如果方法通过直接返回nil或NO来指示失败,你应该在尝试对之做任何事情之前检查返回值为nil或NO。 NSError对象。

Objective-C中的典型用法是

NSError *error;
if ([self verifyPersonalizationWithError:&error]) {
    NSLog(@"success");
} else {
    NSLog(@"failed: %@", error.localizedDescription);
}

Swift方法在​​失败时抛出错误,因此不需要布尔返回值:

do {
    try verifyPersonalization()
    print("success")
} catch {
    print("failed:", error.localizedDescription)
}

如果Objective-C方法通过在error参数中留下非null错误(而不是返回false ,这是通常的Cocoa模式) 确实指示失败,那么您可以通过添加属性来指示:

- (BOOL) verifyPersonalizationWithError:(NSError **) error
    __attribute__((swift_error(nonnull_error)));

这是导入Swift的

open func verifyPersonalization() throws -> Bool

swift_error属性记录在https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM