[英]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.