2017-08-08 9 views
1

私はSwiftで新しく、Objective-Cでブリッジングするためのいくつかの機能の探索を開始します。NS_REFINED_FOR_SWIFTと戻り値

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

今、私はいくつかの改良のためにスウィフトにメソッドにアクセスすることができますが、戻り値は失われます。

現在、私はあるNSError参照してメソッドを持っています。 スウィフトのための生成方法は次のとおりです。

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インタフェースを提供することができ、オリジナルの実装をcalleにすることができますd (Swift and Objective-C in the Same Projectの「Objective-C宣言の詳細化」を参照してください)。

重要:成功または失敗

スウィフトインポータは、Objective-Cのメソッドのブール戻り値がUsing and Creating Error Objectsに記載されているように、共通のココアパターン ある成功または 失敗を示すことを前提としていメソッドの戻り値で示されます。 ココアのエラー ドメインで間接的にエラーオブジェクトを返すCocoaのメソッドは、メソッドが失敗を示す場合、そのようなオブジェクトを返すことが保証されていますが、NILまたはNOを直接返すことによって の値がnilまたは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を返し、)エラーパラメータにnull以外のエラーは、あなたは その属性を追加することによって示すことができます:

としてスウィフトにインポートされ

- (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