Swift 6.0 beta 日本語化計画 : Swift 6.0 beta
ネストした型
列挙型は、多くの場合、特定のクラスまたは構造体の機能をサポートするために作成されます。同様に、より複雑な型のコンテキスト内で使用するためだけにユーティリティ構造を定義したり、通常は特定の型と組み合わせて使用されるプロトコルを定義したりすると便利な場合があります。これを実現するために、Swift は、ネストした型 を定義し、それによって列挙型、クラス、およびプロトコル、それらがサポートする型の定義の中で、ネストした型をサポートできます。
他の型の中の型をネストするには、それがサポートする型の外側の括弧内でその定義を書きます。必要とされるだけ多くのレベルで型をネストできます。
以下の例は、ブラックジャックのゲームで使われるようなトランプをモデルとして、BlackjackCard という構造体を定義しています。BlackjackCard 構造体は、Suit と Rank と言う2つのネストした列挙型を含んでいます。
ブラックジャックでは、エースのカードは、1または11のいずれかの値を有します。この機能は、Rank 列挙型の中にネストした、Values と言う構造体によって表されます:
Suit 列挙型は、それらのシンボルを表現する生の Character 値と一緒に、4つの一般的なトランプの種類を説明しています。
Rank 列挙型は、それらの表の値を表すために、生の Int 値と共に、取りうる13のトランプの順位を説明しています。(この生の Int 値はジャック、クイーン、キング、エースのトランプには使用されません。)
前述したように、Rank 列挙型は、独自の、Values と言う更にネストになった構造体を定義しています。この構造体は、ほとんどのトランプは、1つの値を持っているが、エースのカードは、2つの値を持っていることをカプセル化しています。Values 構造体は、これを表現するために2つのプロパティを定義しています。
Rank (順位) はまた、Values 構造体のインスタンスを返す計算されたプロパティ、values も定義しています。この計算されたプロパティは、トランプの順位を考慮し、その順位に基づいて適切な値を使用して新しい Values インスタンスを初期化します。それは、jack,queen,king,ace では特別な値を使用します。数字のトランプの場合、それは順位の生の Int 値を使用します。
BlackjackCard 構造体自体は、2つのプロパティ、 rank と suit を持っています。また、description と言う計算されたプロパティも定義し、トランプの名前と値の説明をビルドするため rank と suit に格納された値を使います。description プロパティは、表示すべき第二の値があるかどうかを optional の結合を使って確認し、もしあれば、その第二の値の追加の説明の詳細を挿入します。
BlackjackCard はカスタムのイニシャライザがない構造体であるため、構造体型のためのメンバー化イニシャライザ で説明したように、それは暗黙的にメンバー化されたイニシャライザを持っています。theAceOfSpades と言う新しい定数を初期化するのに、このイニシャライザを使用できます:
Rank と Suit は BlackjackCard 内にネストされているにもかかわらず、それらの型は、文脈から推測できるので、このインスタンスの初期化は、その case 名(.ace と .spades) だけでで列挙型 case を参照できます。上記の例では、description プロパティは、正しくスペードのエースが 1 または 11 の値を持っていることを報告します。
ネストした型を、その定義文脈の外で使用するには、その名前の前に、それがネストされている中の型の名前を、接頭辞として付けます:
上記の例の場合、これは Suit、Rank、および Values の名前を故意に短くしていますが、それというのもそれらの名前が、定義されている文脈によって自然に資格が与えられるからです。