我是Swift的新手,我开始探索一些与目标C连接的特性。
目前,我有一个带有NSError引用的方法,即:
- (BOOL) verifyPersonalizationWithError:(NSError **) error NS_REFINED_FOR_SWIFT;现在,我可以在Swift中访问该方法,以进行一些改进,但返回值将丢失。Swift生成的方法是:
open func __verifyPersonalization() throws使用do catch正确处理错误,但返回值似乎丢失了。
我的NS_REFINED_FOR_SWIFT宏缺少什么东西吗?
发布于 2017-08-08 10:47:35
这与NS_REFINED_FOR_SWIFT宏无关。目标C法
- (BOOL) verifyPersonalizationWithError:(NSError **) error;被导入到Swift作为
open func verifyPersonalization() throwsNS_REFINED_FOR_SWIFT宏的唯一效果是在Swift方法名称中加上下划线
open func __verifyPersonalization() throws它允许在扩展中提供精化的Swift接口,同时使原始实现可以从精炼的接口中调用(请参阅迅速和目标-C在同一项目中中的"Refining声明“)。
Swift导入器假设目标-C方法的布尔返回值表示成功或失败,这是使用和创建错误对象中记录的常见Cocoa模式。
的重要性:成功或失败是由方法的返回值表示的。虽然间接返回Cocoa域中的错误对象的Cocoa方法保证返回这些对象,如果该方法通过直接返回nil或NO指示失败,那么在尝试对NSError对象执行任何操作之前,您应该始终检查返回值为零或否。
目标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方法确实通过在error参数中留下一个非空错误来指示失败(而不是返回false,这是通常的Cocoa模式),那么您可以通过添加一个属性来指示这一点:
- (BOOL) verifyPersonalizationWithError:(NSError **) error
__attribute__((swift_error(nonnull_error)));它被导入到Swift作为
open func verifyPersonalization() throws -> Boolswift_error属性记录在https://github.com/apple/swift-clang/blob/383859a9c4b964af3d127b5cc8abd0a8f11dd164/include/clang/Basic/AttrDocs.td#L1800-L1819上。
https://stackoverflow.com/questions/45565960
复制相似问题