17

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

たとえば、NSArrayメソッド+ (instancetype)array;は現在+ (instancetype nonnull)array;

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

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

4

4 に答える 4

19

彼らは、型が null 非許容であるところはどこでも型であることを確認しましたnonnull

以前のNSMutableArray addObject方法のように

- (void)addObject:(ObjectType)anObject  

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

- (void)addObject:(ObjectType nonnull)anObject

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

+ (instancetype nonnull) array

メソッドは決して戻りませんnil

参考:https ://developer.apple.com/swift/blog/?id=25

于 2015-06-23T11:56:12.733 に答える
0

Objective C と Swift の相互運用性を容易にするために、nullable と nonnull が導入されました。

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

nullable アノテーションは、Swift のオプションと同じです。nonnull アノテーションは、Swift の non-optional と同じです。

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

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

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

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

于 2015-06-23T12:37:14.390 に答える