Swift 4.2 日本語化計画 : Swift 4.2


ネストした型


列挙型は、多くの場合、特定のクラスまたは構造体の機能をサポートするために作成されます。同様に、より複雑な型の文脈内で純粋に使用するためのユーティリティクラスと構造体を定義するのが便利なことがあります。これを実現するために、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 の名前を故意に短くしていますが、それというのもそれらの名前が、定義されている文脈によって自然に資格が与えられるからです。



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

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

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






目次
Xcode 10 の新機能

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

SwiftLogo
  • Swift 4.2 全メニュー


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

  • 言語リファレンス

  • マニュアルの変更履歴













  • トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ












    トップへ