Xcode 6.3 では、 Objective-Cの API の意図をより適切に表現するために (そしてもちろん、より良い Swift サポートを確実にするために)新しい注釈が導入されました。これらの注釈は、もちろんnonnull
、nullable
およびnull_unspecified
.
しかし、Xcode 7 では、次のような多くの警告が表示されます。
ポインターに null 許容型指定子 (_Nonnull、_Nullable、または _Null_unspecified) がありません。
それに加えて、Apple は別のタイプの null 可能性指定子を使用して、C コードをマークします ( source )。
CFArrayRef __nonnull CFArrayCreate(
CFAllocatorRef __nullable allocator, const void * __nonnull * __nullable values, CFIndex numValues, const CFArrayCallBacks * __nullable callBacks);
要約すると、これらの 3 つの異なる nullability アノテーションが用意されました。
nonnull
、nullable
、null_unspecified
_Nonnull
、_Nullable
、_Null_unspecified
__nonnull
、__nullable
、__null_unspecified
注釈を使用する理由と場所はわかっていますが、どのタイプの注釈を使用する必要があるか、どこで、なぜ使用する必要があるかについて少し混乱しています。これは私が集めることができるものです:
- プロパティには、、、を使用する必要が
nonnull
ありnullable
ますnull_unspecified
。 - メソッドのパラメーターには、、、を使用する必要が
nonnull
ありnullable
ますnull_unspecified
。 - C メソッドの場合、 , , を使用する必要が
__nonnull
あり__nullable
ます__null_unspecified
。 - ダブルポインターなどの他のケースでは、、、を使用する必要が
_Nonnull
あり_Nullable
ます_Null_unspecified
。
しかし、基本的に同じことを行うアノテーションがこれほど多くある理由については、いまだに混乱しています。
だから私の質問は:
これらの注釈の正確な違いは何ですか?それらを正しく配置する方法とその理由は?