web-dev-qa-db-ja.com

Objective Cの非ヌルとは何ですか?

IOS9でnonnullが導入された理由を誰かが詳しく説明できますか?

たとえば、NSArrayメソッド+ (instancetype)array;+ (instancetype nonnull)array;になりました。

参照: https://developer.Apple.com/library/prerelease/ios/releasenotes/General/iOS90APIDiffs/frameworks/Foundation.html

これはObjective-Cレベルの機能ですか?これは既存のアプリにどのように影響しますか?

14
Mehul Parmar

彼らは、型がnull許容でない場合は常に、それがnonnull型であることを確認しました。

以前のようにNSMutableArray addObjectメソッドは

- (void)addObject:(ObjectType)anObject  

そして今それはに変更されました

- (void)addObject:(ObjectType nonnull)anObject

つまり、このメソッドにnullオブジェクト(nil)を渡すことはできません。同じように、あなたの場合

+ (instancetype nonnull) array

メソッドがnilを返すことはありません。

参照: https://developer.Apple.com/Swift/blog/?id=25

18
Mrunal

nonnullは、戻り値(またはパラメーター、またはプロパティ)がnilになることはないことをコンパイラーに通知するキーワードです。これは以前のバージョンのXcodeで導入され、Obj-CとSwiftのオプションタイプ間の相互運用性を向上させました。

あなたはそれについてもっと学ぶことができます 公式Swiftブログ

9
rounak

nonnullは、オブジェクト/パラメーターによって返される値がnilになることは決してないことをコンパイラーに通知するキーワードです。

一般に、現在アサーションまたは例外を使用している方法で、null許容およびnull以外を大まかに調べる必要があります。コントラクトに違反することはプログラマーのエラーです。特に、戻り値はユーザーが制御できるものであるため、下位互換性のためでない限り、null許容でない戻り値の型に対してnilを返さないでください。

3
Nilesh Patel

目的CとSwiftの相互運用性を容易にするために、null許容および非nullが導入されました。

Objective Cは、オプションの参照とオプション以外の参照の間に違いはありません。その場合、Swiftコンパイラは、ObjectiveCコードへの特定の参照がオプションであるかどうかを確認できません。

null許容アノテーションは、Swiftのオプションと同じです。 null以外の注釈は、Swiftのオプションではないものと同じです。

経験則では、単純なポインタ型はnull以外であると見なされます(詳細については、 公式Swiftブログ )を参照してください)

また、この新しいアノテーションは、ObjectiveCの観点からもコードの品質を向上させると思います。パラメータとしてnilを渡すと、アプリがクラッシュするのではないかと思いますか?例えば:

id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];

この場合、コンパイラは何も言わず、アプリケーションは実行時にクラッシュします。この新しいアノテーションを使用すると、コンパイル時に警告が表示されます。この例はばかげていることは知っていますが、ドキュメントを読まない限り、メソッドを呼び出す前にプロパティがnilであるかどうかを確認する必要があるかどうかわからない場合があります。

0
agy