2017-08-08 61 views
1

我是新来的Swift,我开始探索一些桥接Objective-C的功能。NS_REFINED_FOR_SWIFT和返回值

目前,我有NSError参考这是一个方法:

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

现在我可以访问斯威夫特的方法对一些改进,但返回的值丢失。 为雨燕的生成方法是:

open func __verifyPersonalization() throws 

错误是正确的与做抓处理,但返回的值似乎丢失。

我的NS_REFINED_FOR_SWIFT宏的任何缺失的东西?

+0

证明你有机会检查答案吗?如果您需要更多信息,请告诉我。 –

回答

3

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

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

导入到快速作为

open func verifyPersonalization() throws 

NS_REFINED_FOR_SWIFT宏的唯一的作用是前面加上 下划线来迅方法名

open func __verifyPersonalization() throws 

它允许在扩展中提供改进的Swift接口,同时保持可用的原始实现d来自精制界面 (参见Swift and Objective-C in the Same Project中的“精炼Objective-C声明”)。

的夫特进口商假定Objective-C的方法的布尔返回值指示成功或 失败,这是常见的可可图案 作为记录在Using and Creating Error Objects

重要:成功或失败由方法的返回值指示。 尽管在Cocoa错误 域中间接返回错误对象的Cocoa方法可以保证返回这些对象,如果方法通过直接返回nil或NO指示失败 ,您应该始终检查返回 值是否为零或NO,然后尝试对NSError对象做任何事情。

在Objective-C的典型用法是

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

的夫特方法抛出上失败的错误,所以没有对于一个布尔返回值需要 :

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

如果Objective-C方法真的通过离开表明失败在所述误差参数(而不是返回false,这是通常的可可图案)一个非空的错误,那么您可以指示 通过添加属性:

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

其被导入到快速作为

open func verifyPersonalization() throws -> Bool 

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