Article

Designating Nullability in Objective-C APIs Objective-C APIにおいてヌル可能性を指定する

Use nullability annotations or mark regions as annotated to control how Objective-C declarations are imported into Swift. ヌル可能性注釈を使うかまたは領域が注釈されると印することで、どのようにObjective-C宣言がSwiftへとインポートされるかを制御してください。

Overview 概要

In Objective-C, you work with references to objects by using pointers that can be null, called nil in Objective-C. In Swift, all values — including object instances — are guaranteed to be non-null. Instead, you represent a value that could be missing as wrapped in an optional type. When you need to indicate that a value is missing, you use the value nil. Objective-Cでは、あなたはオブジェクトへの参照をヌル、Objective-Cにおいてnilと呼ばれるもの、であることが可能なポインタを使用して扱います。Swiftでは、すべての値は — オブジェクトインスタンスを含めて — 非ヌルであることが保証されます。代わりに、あなたは見つからないかもしれない値をオプショナル型でラップすることで表します。あなたはその値が見つからないことを指し示す必要がある場合、値nilを使います。

You can annotate declarations in your Objective-C code to indicate whether an instance can have a null or nil value. Those annotations change how Swift imports your declarations. For an example of how Swift imports unannotated declarations, consider the following code: あなたは、あなたのObjective-Cコードの中の宣言に注釈をつけることで、あるインスタンスがヌルまたはnil値を持つことが可能かどうかを指し示せます。それら注釈は、どのようにSwiftがあなたの宣言をインポートするかを変更します。どのようにSwiftが注釈を付けられない宣言をインポートするかの例として、以下のコードを考慮してください:


@interface MyList : NSObject
- (MyListItem *)itemWithName:(NSString *)name;
- (NSString *)nameForItem:(MyListItem *)item;
@property (copy) NSArray<MyListItem *> *allItems;
@end

Swift imports each object instance parameter, return value, and property as an implicitly wrapped optional: Swiftは、オブジェクトインスタンスパラメータ、戻り値、そしてプロパティそれぞれを暗黙的にラップされたオプショナルとしてインポートします:


class MyList: NSObject {
    func item(withName name: String!) -> MyListItem!
    func name(for item: MyListItem!) -> String!
    var allItems: [MyListItem]!
}

Annotate Nullability of Individual Declarations 個々の宣言のヌル可能性に注釈を付ける

You can use nullability annotations in your Objective-C code to designate whether a parameter type, property type, or return type is nullable. Annotate property declarations, parameter types, and return types that are simple objects or block pointers using the nullable, nonnull, and null_resettable property attributes. If no nullability information is provided for a type, Swift doesn't distinguish between optional and nonoptional references, and imports the type as an implicitly unwrapped optional. あなたは、ヌル可能性注釈をあなたのObjective-Cコードにおいて使用して、パラメータ型、プロパティ型、または戻り値がヌル可能性であるかどうかを指定します。プロパティ宣言、パラメータ型、そして戻り値で、nullablenonnull、そしてnull_resettableプロパティ属性を使っている単純なオブジェクトまたはブロックパラメータであるものに注釈を付けてください。ヌル可能性情報がある型に提供されないならば、Swiftはオプショナルと非オプショナル参照の間の区別をしません、そしてその型をある暗黙的にアンラップされるオプショナルとしてインポートしてください。

This list describes how Swift imports types with different nullability annotations: このリストは、どのようにSwiftが異なるヌル可能性注釈で型をインポートするかを記述します:

  • Nonnullable—Imported as nonoptionals, whether annotated directly or by inclusion in an annotated region 非ヌル可能性 — 非オプショナルとしてインポートされます、直接に注釈を付けられようとまたは注釈を付けられた領域の中に包含されようと

  • Nullable—Imported as optionals ヌル可能性 — オプショナルとしてインポートされます

  • Without a nullability annotation or with a null_resettable annotation—Imported as implicitly unwrapped optionals ヌル可能性注釈なしまたはnull_resettable注釈あり — 暗黙的にアンラップされるオプショナルとしてインポートされます

The following code shows the MyList type after annotation. The return types of the two methods are annotated as nullable, because the methods return nil if the list doesn't contain the given list item or name. All other object instances are annotated as nonnull. 以下のコードは、注釈の後のMyList型を示します。2つのメソッドの戻り型はnullableとして注釈を付けられます、なぜならこれらメソッドはnilを、そのリストが与えられたリスト項目または名前を含まないならば返すからです。全ての他のオブジェクトインスタンスは、nonnullであると注釈を付けられます。


@interface MyList : NSObject
- (nullable MyListItem *)itemWithName:(nonnull NSString *)name;
- (nullable NSString *)nameForItem:(nonnull MyListItem *)item;
@property (copy, nonnull) NSArray<MyListItem *> *allItems;
@end

With these annotations, Swift imports the MyList type without using any implicitly wrapped optionals: これら注釈で、SwiftはMyList型を何らかの暗黙的にラップされるオプショナルを使うことなしにインポートします。


class MyList: NSObject {
    func item(withName name: String) -> MyListItem?
    func name(for item: MyListItem) -> String?
    var allItems: [MyListItem]
}

The nullable and nonnull annotations are simplified forms of the _Nullable and _Nonnull annotations, which you can use in almost any context that you would use the const keyword with a pointer type. Complex pointer types, such as id *, must be explicitly annotated using these annotations. For example, to specify a nonnullable pointer to a nullable object reference, use _Nullable id * _Nonnull. nullablenonnull注釈は、_Nullable_Nonnull注釈の簡素化された形式です、それはあなたがconstキーワードをポインタ型とともに使うであろう、ほとんどあらゆる文脈で使用できます。複雑なポインタ型、例えばid *などは、これら注釈を使って、明示的に注釈を付けられなければなりません。例えば、ヌル可能性オブジェクト参照への非ヌル可能性ポインタを指定するには、_Nullable id * _Nonnullを使ってください。

Annotate Regions as Nonnullable 領域に非ヌル可能性として注釈を付ける

You can simplify the process of annotating your Objective-C code by marking entire regions as audited for nullability. Within a section of code demarcated by the NS_ASSUME_NONNULL_BEGIN and NS_ASSUME_NONNULL_END macros, you only need to annotate the nullable type declarations. Unannotated declarations within the audited region are treated as nonnullable. あなたは、あなたのObjective-Cコードに注釈を付ける行程を領域全体をヌル可能性について監査されると印することによって簡素化できます。NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_ENDマクロによって境界線を引かれるコード区画内で、あなたはヌル可能性宣言に注釈を付ける必要だけがあります。監査された領域内部の注釈を付けられない宣言は、非ヌル可能性として取り扱われます。

Marking the MyList declaration as audited for nullability reduces the number of annotations that are required. Swift imports the type the same way as in the previous section. MyList宣言をヌル可能性について監査済みと印することは、必要とされる注釈の数を減らします。Swiftは、その型を以前の節と同じ方法でインポートします。


NS_ASSUME_NONNULL_BEGIN


@interface MyList : NSObject
- (nullable MyListItem *)itemWithName:(NSString *)name;
- (nullable NSString *)nameForItem:(MyListItem *)item;
@property (copy) NSArray<MyListItem *> *allItems;
@end


NS_ASSUME_NONNULL_END

Note that typedef types aren't assumed to be nonnull, even within audited regions, because they aren't inherently nullable. typedef型は非ヌルであると仮定されません、監査済み領域内でさえもです、なぜならそれらはそもそもヌル可能でないからです。

See Also 参照

Customizing Objective-C APIs Objective-C APIをカスタマイズする