Swift 5.8 日本語化計画 : Swift 5.8


ネストした型


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


列挙型は、多くの場合、特定のクラスまたは構造体の機能をサポートするために作成されます。同様に、より複雑な型の文脈内で純粋に使用するためのユーティリティ構造体とクラスを定義するのが便利なことがあります。これを実現するために、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つのプロパティを定義しています。


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 の名前を故意に短くしていますが、それというのもそれらの名前が、定義されている文脈によって自然に資格が与えられるからです。



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
















トップへ












トップへ












トップへ












トップへ
目次
Xcode の新機能

Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)

SwiftLogo
  • Swift 5.8 全メニュー


  • Swift へようこそ
  • Swift について
  • Swift 言語のガイド
  • Swift の基本
  • 基本演算子
  • 文字列と文字
  • コレクション型
  • フロー制御
  • 関数
  • クロージャ
  • 列挙型
  • 構造体とクラス
  • プロパティ
  • メソッド
  • サブスクリプト
  • 継承
  • 初期化
  • デイニシャライザ
  • Optional の連鎖
  • エラー処理
  • 同時実行
  • 型キャスト
  • ネストした型
  • 拡張機能
  • プロトコル
  • ジェネリック(汎用)
  • 自動参照カウント
  • メモリの安全性
  • アクセス制御
  • 高度な演算子

  • 言語リファレンス

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ