Swift 6.0 beta 日本語化計画 : Swift 6.0 beta


ネストした型


別の型のスコープ内で型を定義します。


列挙型は、多くの場合、特定のクラスまたは構造体の機能をサポートするために作成されます。同様に、より複雑な型のコンテキスト内で使用するためだけにユーティリティ構造を定義したり、通常は特定の型と組み合わせて使用されるプロトコルを定義したりすると便利な場合があります。これを実現するために、Swift は、ネストした型 を定義し、それによって列挙型、クラス、およびプロトコル、それらがサポートする型の定義の中で、ネストした型をサポートできます。


他の型の中の型をネストするには、それがサポートする型の外側の括弧内でその定義を書きます。必要とされるだけ多くのレベルで型をネストできます。



実際のネストした型


以下の例は、ブラックジャックのゲームで使われるようなトランプをモデルとして、BlackjackCard という構造体を定義しています。BlackjackCard 構造体は、SuitRank と言う2つのネストした列挙型を含んでいます。


ブラックジャックでは、エースのカードは、1または11のいずれかの値を有します。この機能は、Rank 列挙型の中にネストした、Values と言う構造体によって表されます:


  1. struct BlackjackCard {
  2. // nested Suit enumeration
  3. enum Suit: Character {
  4. case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
  5. }
  6. // nested Rank enumeration
  7. enum Rank: Int {
  8. case two = 2, three, four, five, six, seven, eight, nine, ten
  9. case jack, queen, king, ace
  10. struct Values {
  11. let first: Int, second: Int?
  12. }
  13. var values: Values {
  14. switch self {
  15. case .ace:
  16. return Values(first: 1, second: 11)
  17. case .jack, .queen, .king:
  18. return Values(first: 10, second: nil)
  19. default:
  20. return Values(first: self.rawValue, second: nil)
  21. }
  22. }
  23. }
  24. // BlackjackCard properties and methods
  25. let rank: Rank, suit: Suit
  26. var description: String {
  27. var output = "suit is \(suit.rawValue),"
  28. output += " value is \(rank.values.first)"
  29. if let second = rank.values.second {
  30. output += " or \(second)"
  31. }
  32. return output
  33. }
  34. }


Suit 列挙型は、それらのシンボルを表現する生の Character 値と一緒に、4つの一般的なトランプの種類を説明しています。


Rank 列挙型は、それらの表の値を表すために、生の Int 値と共に、取りうる13のトランプの順位を説明しています。(この生の Int 値はジャック、クイーン、キング、エースのトランプには使用されません。)


前述したように、Rank 列挙型は、独自の、Values と言う更にネストになった構造体を定義しています。この構造体は、ほとんどのトランプは、1つの値を持っているが、エースのカードは、2つの値を持っていることをカプセル化しています。Values 構造体は、これを表現するために2つのプロパティを定義しています。


  • Int 型の first
  • Int? または "optional Int" 型の second

Rank (順位) はまた、Values 構造体のインスタンスを返す計算されたプロパティ、values も定義しています。この計算されたプロパティは、トランプの順位を考慮し、その順位に基づいて適切な値を使用して新しい Values インスタンスを初期化します。それは、jack,queen,king,ace では特別な値を使用します。数字のトランプの場合、それは順位の生の Int 値を使用します。


BlackjackCard 構造体自体は、2つのプロパティ、 ranksuit を持っています。また、description と言う計算されたプロパティも定義し、トランプの名前と値の説明をビルドするため ranksuit に格納された値を使います。description プロパティは、表示すべき第二の値があるかどうかを optional の結合を使って確認し、もしあれば、その第二の値の追加の説明の詳細を挿入します。


BlackjackCard はカスタムのイニシャライザがない構造体であるため、構造体型のためのメンバー化イニシャライザ で説明したように、それは暗黙的にメンバー化されたイニシャライザを持っています。theAceOfSpades と言う新しい定数を初期化するのに、このイニシャライザを使用できます:


  1. let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
  2. print("theAceOfSpades: \(theAceOfSpades.description)")
  3. // prints "theAceOfSpades: suit is ♠, value is 1 or 11"


RankSuitBlackjackCard 内にネストされているにもかかわらず、それらの型は、文脈から推測できるので、このインスタンスの初期化は、その case 名(.ace.spades) だけでで列挙型 case を参照できます。上記の例では、description プロパティは、正しくスペードのエースが 1 または 11 の値を持っていることを報告します。



ネストした型への参照


ネストした型を、その定義文脈の外で使用するには、その名前の前に、それがネストされている中の型の名前を、接頭辞として付けます:


  1. let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
  2. // heartsSymbol is "♡"


上記の例の場合、これは SuitRank、および Values の名前を故意に短くしていますが、それというのもそれらの名前が、定義されている文脈によって自然に資格が与えられるからです。



前:型キャスト 次:拡張機能

<BETA SOFTWARE>
このドキュメントには、開発中の API または技術に関する予備的な情報が含まれています。この情報は変更されることがあり、このドキュメントに従って実装されたソフトウェアは、最終的なオペレーティングシステムソフトウェアでテストする必要があります。

Apple の Beta ソフトウエアについての詳細

















トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ












トップへ