70

Xcode 7 GM では、次の警告が表示され始めました。

ポインターに null 許容型指定子 (_Nonnull、_Nullable、または _Null_unspecified) がありません

次の関数宣言で (NSUserDefaults 拡張)

- (void)setObject:(nullable id)value
           forKey:(NSString *)defaultName
    objectChanged:(void(^)(NSUserDefaults *userDefaults, id value))changeHandler
    objectRamains:(void(^)(NSUserDefaults *userDefaults, id value))remainHandler;

スクリーンショット

この警告が表示される理由と修正方法を教えてください。

4

6 に答える 6

64

nullableハンドラ/ブロックにも指定する必要があります

- (void)setObject:(nullable id)value
           forKey:(nonnull NSString *)defaultName
    objectChanged:(nullable void(^)(NSUserDefaults *userDefaults, id value))changeHandler
    objectRamains:(nullable void(^)(NSUserDefaults *userDefaults, id value))remainHandler;

なんで?スイフトのせいです。Swift ではオプションのパラメーター (?) を使用できますが、Objective-C では使用できません。これは、Swift コンパイラーがこれらのパラメーターがオプションであることを認識できるように、両者の間の橋渡しとして行われます。「Nonnull」は、引数が必須であることを Swift コンパイラに伝えます。オプションである nullable

詳細については、 https ://developer.apple.com/swift/blog/?id=25 を参照してください。

于 2015-09-12T17:00:47.213 に答える
11

_Nonnullorを追加する理由を説明するために、この回答を投稿しますnullable

このブログによると: https://developer.apple.com/swift/blog/?id=25

Swift の優れた点の 1 つは、Objective-C コード (Objective-C で記述された既存のフレームワークとアプリ内のコードの両方) と透過的に相互運用できることです。NSViewただし、 Swiftでは、オプションの参照と非オプションの参照の間に強い区別がありNSView?ますNSView *。Swift コンパイラは、特定のものがオプションかどうかを確認できないためNSView *、型は暗黙的にアンラップされたオプションとして Swift に取り込まれますNSView!

すべては Swift のためです。

于 2016-08-16T03:14:46.800 に答える
1

以下のマクロを .h ファイルから削除すると、警告が消えます

NS_ASSUME_NONNULL_BEGIN 

NS_ASSUME_NONNULL_END
于 2019-09-19T07:24:30.427 に答える