Xcode「Pointer is missing a nullability type specifier」の対処方法

Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
// !!!: Pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
-(NSString *)hoge:(NSString *)hoge;
@property (nonatomic) NSString *foo;
@property (nonatomic) NSString *bar;
void function(NSString *str);

Objective-Cに新たに取り入れられた「Nullability」という仕組みが原因です。

解決方法1

ヘッダーファイル内で一つでもnullablenonnull, _Nullable, _Nonnull等のキーワードを利用するとこのような警告が発生します。それらを削除すれば警告は消えますが、それでも警告が消えない場合は、全ての型名にNullability属性を指定する必要があります。> 解決方法2> 解決方法3を試してみてください。

解決方法2

警告発生箇所があまりにも多い場合は、ヘッダーファイル内のコードをNS_ASSUME_NONNULL属性で囲ってあげると、とりあえず警告は回避できます。

NS_ASSUME_NONNULL_BEGIN
@interface SuperMan
-(NSString *)hoge:(NSString *)hoge;
@property (nonatomic) NSString *foo;
@property (nonatomic) NSString *bar;
void function(NSString *str);
@end
NS_ASSUME_NONNULL_END

この場合、各プロパティーはnilの代入を厳しくチェックするようになりますので、nilを容認するプロパティには個別にnullable属性や_Nullable属性を追加する必要が出てきます。

-(NSString *)hoge:(nullable NSString *)hoge;
@property (nonatomic, nullable) NSString *foo;
void function(NSString *_Nullable str);

解決方法3

Nullability属性を個別に指定する方法もあります。 Objective-Cのメソッド・プロパティーとC言語の関数や変数で異なるキーワード使っている点に注意してください。

-(nonnull NSString *)hoge:(nullable NSString *)hoge;
@property (nonatomic, nonnull) NSString *foo;
@property (nonatomic, nullable) NSString *bar;

void function(NSString *_Nullable str);
@interface Hoge : NSString {
   NSString *_Nonnull _buz;
}
@end

Nullability記法まとめ

上記サンプルの通り、Objective-Cのメソッド・プロパティーとC言語の関数・変数では異なるキーワードを用います。以下の対応表を参考にしてください。

メソッド/プロパティー変数・関数
nil/null 可nullable_Nullable
nil/null 不可nonnull_Nonnull
※ なお、_Nullable/_Nonnullの代わりに__nullable/__nonnullを利用することも可能です

補足

weak属性のプロパティーにnonnullオプションを利用するとエラーになります。

@property (nonatomic, weak  , nonnull) NSString *foo; // Error: Property attributes 'nonnull' and 'weak' are mutually exclusive
@property (nonatomic, strong, nonnull) NSString *foo; // OK

weakプロパティはオブジェクト解放時にnilに変化するという性質があるため、「nilを受け付けない・nilを返さない」ことを保証するためのnonnullが指定できないというのも頷けます。

広告