NS_ASSUME_NONNULL_BEGIN&NS_ASSUME_NONNULL_END



Ns_assume_nonnull_begin Ns_assume_nonnull_end



Swiftでは、使用できます!と?オブジェクトがoptional Still non-optional、たとえばview? with view!であることを示します。そしてObjective-C中国にはそのような区別はありません。viewこのオブジェクトがoptionalであることを意味する場合がありますnon-optionalを意味する場合もあります。これにより問題が発生します:in Swift vsus Objective-Cミキシング時、Swiftコンパイラは1つを認識しませんObjective-Cオブジェクトはoptionalまだですnon-optionalなので、この場合、コンパイラは暗黙的にObjective-C Object as non-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_BEGINNS_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 *など)is nonを指定するには表示する必要がありますnullまだnullableです。たとえば、ポインタを指定しますnullableオブジェクトnonnullaポインタを使用できます '__nullable id * __nonnull”。
  • よく使用しますNSError **は通常、ポインティングnullable NSErrorオブジェクトnullableポインターと見なされます。

転載:https://www.jianshu.com/p/65d344264688