这与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 and Objective-C in the Same Project 中的“优化 Objective-C 声明”)。
Swift 导入器假定 Objective-C 方法的布尔返回值表示成功或
失败,这是常见的 Cocoa 模式
如Using and Creating Error Objects 中所述:
重要提示:成功或失败由方法的返回值指示。
虽然在 Cocoa 错误中间接返回错误对象的 Cocoa 方法
如果方法指示失败,则域保证返回此类对象
通过直接返回 nil 或 NO,您应该始终检查返回
在尝试对 NSError 对象执行任何操作之前,值为 nil 或 NO。
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方法真的表示失败,离开
错误参数中的非空错误(而不是返回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