4

新しいコンパイラ警告を有効にしましたCLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION。ほとんどの警告は解決できましたが、1 つはマクロに起因するものであり、問​​題の解決方法がわかりません。

マクロは次のようになります。

#define MYAssertionFail(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]

次のエラーが表示されます。

null 許容ポインター 'NSString * _Nullable' から null 非許容ポインター型 'NSString * _Nonnull' への暗黙的な変換

マクロを書き直す方法はありますか?

すでに試し__PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS/__PRAGMA_POP_NO_EXTRA_ARG_WARNINGSましたが、役に立ちませんでした。

4

1 に答える 1

6

初め:

- (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(4,5);

に包まれNS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END

これは、コンパイラがこの関数宣言を次のように解決することを意味します。

- (void)handleFailureInFunction:(NSString * _Nonnull)functionName file:(NSString * _Nonnull)fileName lineNumber:(NSInteger)line description:(nullable NSString *)format,... NS_FORMAT_FUNCTION(4,5);

2番

+ (nullable id)stringWithCString:(const char *)bytes NS_DEPRECATED(10_0, 10_4, 2_0, 2_0);

この関数は、null 許容 ID を返します。変換すると、これはNSString * _Nullable

結論として

次のように関数呼び出しにキャストを追加するだけで十分です。

#define MYAssertionFail(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:(NSString * _Nonnull)[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:(NSString * _Nonnull)[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__]

Obj-C と Swift の nullability について詳しく知りたい場合は、この問題に関する Apple のブログ記事をお読みください: https://developer.apple.com/swift/blog/?id=25

于 2015-11-13T12:23:26.587 に答える