2017-08-08 32 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