166

Xcode 6.3 では、 Objective-Cの API の意図をより適切に表現するために (そしてもちろん、より良い Swift サポートを確実にするために)新しい注釈が導入されました。これらの注釈は、もちろんnonnullnullableおよび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 アノテーションが用意されました。

  • nonnullnullablenull_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

しかし、基本的に同じことを行うアノテーションがこれほど多くある理由については、いまだに混乱しています。

だから私の質問は:

これらの注釈の正確な違いは何ですか?それらを正しく配置する方法とその理由は?

4

4 に答える 4

30

スウィフトのブログから:

この機能は、キーワード __nullable および __nonnull を使用して Xcode 6.3 で最初にリリースされました。サードパーティのライブラリと競合する可能性があるため、Xcode 7 ではこれらを _Nullable および _Nonnull に変更しました。ただし、Xcode 6.3 との互換性のために、マクロ __nullable および __nonnull を定義して、新しい名前に展開します。

于 2015-11-23T04:14:37.723 に答える
29

クランのドキュメントから:

nullability (型) 修飾子は、特定のポインター型の値を null にすることができるかどうかを表します。

ほとんどの場合、 と を使用nonnullnullableます。

以下は、利用可能なすべての指定子です。この記事から:

  • null_unspecified: これがデフォルトです。これは、Swift の暗黙的にラップ解除されたオプションにブリッジします。
  • nonnull: 値は nil にはなりません。これは、Swift の通常の参照に橋渡しします。
  • nullable: 値は nil にすることができます。Swift オプションにブリッジします。
  • null_resettable: 読み取り時に値を nil にすることはできませんが、nil に設定してリセットすることはできます。プロパティのみに適用されます。

上記の表記法は、プロパティまたは関数/変数のコンテキストで使用するかどうかによって異なります。

ポインターとプロパティの表記

この記事の著者は、次のような良い例も提供しています。

// property style
@property (nonatomic, strong, null_resettable) NSString *name;

// pointer style
+ (NSArray<NSView *> * _Nullable)interestingObjectsForKey:(NSString * _Nonnull)key;

// these two are equivalent!
@property (nonatomic, strong, nullable) NSString *identifier1;
@property (nonatomic, strong) NSString * _Nullable identifier2;
于 2016-01-07T20:20:15.273 に答える