Article

Grouping Related Objective-C Constants 関連するObjective-C定数をグループにする

Add macros to your Objective-C types to group their values in Swift. マクロをあなたのObjective-C型に加えて、それらの値をSwiftにおいてグループにまとめます。

Overview 概要

You use one of the following macros to declare that several Objective-C constants are related to each other: あなたは、以下のマクロの1つを使って、いくつかのObjective-C定数が互いに関連することを宣言します:

  • NS_ENUM for simple enumerations NS_ENUMを単純な列挙に対して

  • NS_CLOSED_ENUM for simple enumerations that can never gain new cases NS_CLOSED_ENUMを決して新しいケース節が増えることが出来ない単純な列挙に対して

  • NS_OPTIONS for enumerations whose cases can be grouped into sets of options NS_OPTIONSを、それのケース節がひとそろいのオプションへとグループにできる列挙に対して

  • NS_TYPED_ENUM for enumerations with a raw value type that you specify NS_TYPED_ENUMを、あなたが指定する生の値型を使う列挙に対して

  • NS_TYPED_EXTENSIBLE_ENUM for enumerations that you expect might gain more cases NS_TYPED_EXTENSIBLE_ENUMを、もっとケース節が増えることをあなたが予想する列挙に対して

Declare Simple Enumerations 単純な列挙を宣言する

Use the NS_ENUM macro for simple groups of constants. NS_ENUMマクロを、単純な定数のグループに対して使ってください。

The example below uses the macro to declare a UITableViewCellStyle enumeration that groups several different view styles for table views: 下の例は、このマクロを使って、UITableViewCellStyle列挙を宣言します、それはテーブルビューに対する幾つかの異なるビュースタイルをグループにまとめます:


typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
};

In Swift, the UITableViewCellStyle enumeration is imported like this: Swiftでは、UITableViewCellStyle列挙はこのようにインポートされます:


enum UITableViewCellStyle: Int {
    case `default`
    case value1
    case value2
    case subtitle
}

Enumerations imported using the NS_ENUM macro won't fail when you initialize one with a raw value that does not correspond to an enumeration case. This characteristic facilitates compatibility with C, which allows any value to be stored in an enumeration, including values used internally but not exposed in headers. NS_ENUMマクロを使ってインポートされる列挙は、あなたが列挙ケース節に一致しない生の値を持つものを初期化する場合に、失敗しません。この特徴は、Cとの互換性を容易にします、それはどんな値も列挙に格納されることを許します、内部的に使われるがヘッダに暴露されない値も含めて。

The NS_ENUM macro is the only enumeration macro that results in an actual enumeration type when imported to Swift. The other enumeration macros generate structures. NS_ENUMマクロは、Swiftにインポートされる場合に実際の列挙型という結果になるただ1つの列挙マクロです。他の列挙マクロは、構造体を生成します。

Declare Closed Enumerations 完結列挙を宣言する

Use the NS_CLOSED_ENUM macro for a simple group of constants that you can never add new cases to. Closed enumerations are useful for representing a finite set of states that you expect people to switch over using a switch statement. The three cases of ComparisonResultComparisonResult.orderedAscending, ComparisonResult.orderedSame, and ComparisonResult.orderedDescending—are an example of a finite set. They're the only logical cases for performing an ordered comparison during tasks like sorting. NS_CLOSED_ENUMマクロを、あなたが決してそれに新しいケース節を加えることが出来ない、ある単純な定数グループに対して使ってください。完結列挙は、人々がスイッチ文を使って切り替えることをあなたが期待する、ある有限な一揃いの状態を表すのに役立ちます。ComparisonResultの3つのケース節 —ComparisonResult.orderedAscendingComparisonResult.orderedSame、そしてComparisonResult.orderedDescending— はある有限な集合の一例です。それらは、ソートのようなタスクの間に順序あり比較を実行するための論理的な場合にのみのものです。

Don't use the NS_CLOSED_ENUM macro if: NS_CLOSED_ENUMを使わないでください、もし:

  • You've ever added cases to an enumeration after its initial declaration あなたが決してケース節を、ある列挙に対してそれの最初の宣言の後に加えないならば

  • You can think of additional cases you might add later あなたが後で加えるかもしれない追加のケース節を考える可能性があるならば

  • The enumeration has any private cases 列挙が何らかのプライベートなケース節を持つならば

In these scenarios, use the NS_ENUM macro instead. それらの予想される事態には、NS_ENUMマクロを代わりに使ってください。

Declare Option Sets オプションセットを宣言する

You use the NS_OPTIONS macro when two or more constants in a grouping of constants can be combined. For example, the output formatting for a JSONEncoder instance can be sorted and can use ample white space at the same time, so it's valid to specify both options in an option set: [.sorted, .prettyPrinted]. あなたは、NS_OPTIONSマクロを、ある定数グループの中の2つ以上の定数が結合可能である場合に使います。例えば、JSONEncoderインスタンスに対する出力書式設定は、ソート可能です、そして同時に豊富な空白を使用可能です、それでそれは両方のオプションをあるオプションセットにおいて指定することは有効です:[.sorted, .prettyPrinted]

The example below shows how to apply the NS_OPTIONS macro and assign raw values that are mutually exclusive: 下の例は、NS_OPTIONSマクロを適用する、そして互いに排他的である生の値を割り当てる方法を示します:


typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
        UIViewAutoresizingNone                 = 0,
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
        UIViewAutoresizingFlexibleWidth        = 1 << 1,
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
        UIViewAutoresizingFlexibleHeight       = 1 << 4,
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

The increasing sequence of nonnegative integers used along with the bitwise left shift operator (<<) ensures that each option in the option set takes up a unique bit in the binary representation of the raw value. 非負整数からなるシーケンスの漸増、それだけでなくビット単位左シフト演算子(<<)は、オプションセットの中の各オプションが、生の値のバイナリ表現においてある特有なビットを取ることを確実にします。

Here's how the UIViewAutoresizing type is imported to Swift: ここに、UIViewAutoresizing型がSwiftへとインポートされる方法があります:


public struct UIViewAutoresizing: OptionSet {
    public init(rawValue: UInt)
    
    public static var flexibleLeftMargin: UIViewAutoresizing { get }
    public static var flexibleWidth: UIViewAutoresizing { get }
    public static var flexibleRightMargin: UIViewAutoresizing { get }
    public static var flexibleTopMargin: UIViewAutoresizing { get }
    public static var flexibleHeight: UIViewAutoresizing { get }
    public static var flexibleBottomMargin: UIViewAutoresizing { get }
}

Declare Typed Enumerations 型付き列挙を宣言する

You use the NS_TYPED_ENUM to group constants with a raw value type that you specify. Use NS_TYPED_ENUM for sets of constants that can't logically have values added in a Swift extension, and use NS_TYPED_EXTENSIBLE_ENUM for sets of constants that can be expanded in an extension. あなたは、NS_TYPED_ENUMを使って、あなたが指定する生の値型を持つ定数をグループにまとめます。NS_TYPED_ENUMを、論理的にSwift拡張に加えられた値を持つことができない定数のセットに対して使ってください、そしてNS_TYPED_EXTENSIBLE_ENUMを、ある拡張において拡張されることができる定数のセットに対して使ってください。

The example below uses the NS_TYPED_ENUM macro to declare the different colors used by a traffic light: 下の例は、NS_TYPED_ENUMマクロを使って、信号機によって使われる異なる色を宣言します:


// Store the three traffic light color options as 0, 1, and 2.
typedef long TrafficLightColor NS_TYPED_ENUM;
 
TrafficLightColor const TrafficLightColorRed;
TrafficLightColor const TrafficLightColorYellow;
TrafficLightColor const TrafficLightColorGreen;

The number of colors that a traffic light uses isn't expected to grow, so it's not declared to be extensible. 信号機が使う色の数は増大は想定されません、それでそれは拡張可能に宣言されません。

Here's how the TrafficLightColor type is imported to Swift: ここに、TrafficLightColor型がSwiftへとインポートされる方法があります:


struct TrafficLightColor: RawRepresentable, Equatable, Hashable {
    typealias RawValue = Int
    
    init(rawValue: RawValue)
    var rawValue: RawValue { get }
    
    static var red: TrafficLightColor { get }
    static var yellow: TrafficLightColor { get }
    static var green: TrafficLightColor { get }
}

Declare Typed Extensible Enumerations 型付き拡張可能列挙を宣言する

Extensible enumerations are imported in a similar fashion to nonextensible ones, except that they receive an additional initializer. 拡張可能列挙は、それらが追加的なイニシャライザを受け取ることを除いては、同じようなやり方で拡張可能でないものにインポートされます。

The examples below show how a FavoriteColor type is declared, imported, and extended. The first one declares the FavoriteColor type and adds a single enumeration case for the color blue: 下の例は、FavoriteColor型が宣言、インポート、そして拡張される方法を示します。最初のものは、FavoriteColor型を宣言して、単一の列挙ケース節を青色に対して加えます:


typedef long FavoriteColor NS_TYPED_EXTENSIBLE_ENUM;
FavoriteColor const FavoriteColorBlue;

The additional initializer omits the label requirement for its first parameter: 追加的なイニシャライザは、それの最初のパラメータに対するラベル要件を省略します:


struct FavoriteColor: RawRepresentable, Equatable, Hashable {
    typealias RawValue = Int
    
    init(_ rawValue: RawValue)
    init(rawValue: RawValue)
    var rawValue: RawValue { get }
    
    static var blue: FavoriteColor { get }
}

You can add extensions to extensible enumerations later in your Swift code. あなたは拡張をいくつか加えて、Swiftコードにおいて後で列挙を拡張できます。

The example below adds another favorite color: 下の例は、別のお気に入りの色を加えます:


extension FavoriteColor {
    static var green: FavoriteColor {
        return FavoriteColor(1) // blue is 0, green is 1, and new favorite colors could follow
    }
}

See Also 参照

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