1. ホーム
  2. objective-c

[解決済み] ブロックベースのAPIメソッドでnonnullとnullableのObjective-Cキーワードを使用する方法

2022-10-01 17:13:09

質問

次のような方法を考えてみましょう。

- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

新しい nonnullnullable アノテーションキーワード であれば、以下のようにリッチ化することができます。

- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

が、こんな警告も出る。

ポインタに null 可能な型指定子 (__nonnull または __nullable)

3番目のパラメータ(ブロックのもの)を参照しています。

ドキュメント は、ブロック・パラメーターのnullabilityを指定する方法を例示して説明していません。それは逐語的に述べています

の直後には、アンダースコアなしのnullableとnonnullを使用することができます。 は、型が単純なオブジェクトまたはブロックポインタである限り、開き括弧の直後に使用することができます。 ブロックポインタである限り。

ブロックの2つのキーワードのうちの1つを(どの位置でも)入れてみましたが、うまくいきませんでした。また、アンダースコアの接頭辞を持つバリアント ( __nonnull__nullable ).

したがって、私の質問は、どのようにブロックパラメータにnullabilityセマンティックを指定することができますか?

どのように解決するのですか?

これは動作しているようです

- (void)methodWithArg:(nonnull NSString *)arg1 
  andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
  (NSArray * _Nullable results, NSError * _Nonnull error))completionHandler

ブロックとそのパラメータの両方にnullabilityを指定する必要があります...

EDIT: 詳細については、以下を参照してください。 Swiftブログ