NS_ASSUME_NONNULL_BEGIN&NS_ASSUME_NONNULL_END
Ns_assume_nonnull_begin Ns_assume_nonnull_end
Swift
では、使用できます!と?オブジェクトがoptional
Stillnon-optional
、たとえばview?
withview!
であることを示します。そしてObjective-C
中国にはそのような区別はありません。view
このオブジェクトがoptional
であることを意味する場合がありますnon-optional
を意味する場合もあります。これにより問題が発生します:inSwift
vsusObjective-C
ミキシング時、Swift
コンパイラは1つを認識しませんObjective-C
オブジェクトはoptional
まだですnon-optional
なので、この場合、コンパイラは暗黙的にObjective-C
Object asnon-optional
。
問題が解決しました
Apple in Xcode 6.3
導入されたa Objective-C
新機能:nullability annotations
。この新機能の中心には、2つの新しいタイプの注釈があります。__nullable
__nonnull
で。文字通り、推測できます。__nullable
オブジェクトがNULL
またはnil
である可能性があることを示し、__nonnull
オブジェクトが空であってはならないことを示します。この規則に従わない場合、コンパイラーは警告を出します。
各属性または各メソッドを指定する必要がある場合nonnull
with nullable
これは非常に面倒な作業です。ワークロードを軽減するために、Appleは2つのマクロを提供しています。 NS_ASSUME_NONNULL_BEGIN 、 NS_ASSUME_NONNULL_END 。これら2つのマクロ間のコードでは、すべての単純なポインターオブジェクトはnonnull
であると想定されているため、これらを指定するだけで済みますnullable
ポインター。
NS_ASSUME_NONNULL_BEGIN @interface TestObject : NSObject @property (nonatomic, strong) NSString *testString @property (nonatomic) BOOL isRight @end NS_ASSUME_NONNULL_END
使用規則
typedef
定義されたタイプnullability
機能は通常、たとえAudited
であってもコンテキストに依存します-Regions
その中で、それがnonnull
であると仮定することはできません。- 複雑なポインタタイプ(
id
*など)isnon
を指定するには表示する必要がありますnull
まだnullable
です。たとえば、ポインタを指定しますnullable
オブジェクトnonnulla
ポインタを使用できます '__nullable id
*__nonnull
”。 - よく使用します
NSError
**は通常、ポインティングnullable NSError
オブジェクトnullable
ポインターと見なされます。
転載:https://www.jianshu.com/p/65d344264688