Swift 5.8 日本語化計画 : Swift 5.8
ネストした型
列挙型は、多くの場合、特定のクラスまたは構造体の機能をサポートするために作成されます。同様に、より複雑な型の文脈内で純粋に使用するためのユーティリティ構造体とクラスを定義するのが便利なことがあります。これを実現するために、Swift は、ネストした型 を定義し、それによって列挙型、クラス、および構造体がサポートする型の定義の中で、ネストした型をサポートできます。
他の型の中の型をネストするには、それがサポートする型の外側の括弧内でその定義を書きます。必要とされるだけ多くのレベルで型をネストできます。
実際のネストした型
以下の例は、ブラックジャックのゲームで使われるようなトランプをモデルとして、BlackjackCard という構造体を定義しています。BlackjackCard 構造体は、Suit と Rank と言う2つのネストした列挙型を含んでいます。
ブラックジャックでは、エースのカードは、1または11のいずれかの値を有します。この機能は、Rank 列挙型の中にネストした、Values と言う構造体によって表されます:
- struct BlackjackCard {
- // nested Suit enumeration
- enum Suit: Character {
- case spades = "♠", hearts = "♡", diamonds = "♢", clubs = "♣"
- }
- // nested Rank enumeration
- enum Rank: Int {
- case two = 2, three, four, five, six, seven, eight, nine, ten
- case jack, queen, king, ace
- struct Values {
- let first: Int, second: Int?
- }
- var values: Values {
- switch self {
- case .ace:
- return Values(first: 1, second: 11)
- case .jack, .queen, .king:
- return Values(first: 10, second: nil)
- default:
- return Values(first: self.rawValue, second: nil)
- }
- }
- }// BlackjackCard properties and methodslet rank: Rank, suit: Suitvar description: String {var output = "suit is \(suit.rawValue),"output += " value is \(rank.values.first)"if let second = rank.values.second {output += " or \(second)"}return output}
- }
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つのプロパティ、 rank と suit を持っています。また、description と言う計算されたプロパティも定義し、トランプの名前と値の説明をビルドするため rank と suit に格納された値を使います。description プロパティは、表示すべき第二の値があるかどうかを optional の結合を使って確認し、もしあれば、その第二の値の追加の説明の詳細を挿入します。
BlackjackCard はカスタムのイニシャライザがない構造体であるため、構造体型のためのメンバー化イニシャライザ で説明したように、それは暗黙的にメンバー化されたイニシャライザを持っています。theAceOfSpades と言う新しい定数を初期化するのに、このイニシャライザを使用できます:
- let theAceOfSpades = BlackjackCard(rank: .ace, suit: .spades)
- print("theAceOfSpades: \(theAceOfSpades.description)")
- // prints "theAceOfSpades: suit is ♠, value is 1 or 11"
Rank と Suit は BlackjackCard 内にネストされているにもかかわらず、それらの型は、文脈から推測できるので、このインスタンスの初期化は、その case 名(.ace と .spades) だけでで列挙型 case を参照できます。上記の例では、description プロパティは、正しくスペードのエースが 1 または 11 の値を持っていることを報告します。
ネストした型への参照
ネストした型を、その定義文脈の外で使用するには、その名前の前に、それがネストされている中の型の名前を、接頭辞として付けます:
- let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
- // heartsSymbol is "♡"
上記の例の場合、これは Suit、Rank、および Values の名前を故意に短くしていますが、それというのもそれらの名前が、定義されている文脈によって自然に資格が与えられるからです。
前:型キャスト 次:拡張機能
トップへ
トップへ
トップへ
トップへ
目次
Xcode の新機能
Swift について
Swift と Cocoa と Objective-C (obsolete)
Swift Blog より (obsolete)
Swift 5.8 全メニュー
- Swift へようこそ
- Swift について
- Swift 言語のガイド
- Swift の基本
- 基本演算子
- 文字列と文字
- コレクション型
- フロー制御
- 関数
- クロージャ
- 列挙型
- 構造体とクラス
- プロパティ
- メソッド
- サブスクリプト
- 継承
- 初期化
- デイニシャライザ
- Optional の連鎖
- エラー処理
- 同時実行
- 型キャスト
- ネストした型
- 拡張機能
- プロトコル
- ジェネリック(汎用)
- 自動参照カウント
- メモリの安全性
- アクセス制御
- 高度な演算子
- 言語リファレンス
- マニュアルの変更履歴
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ
トップへ