メモの概要(八)--Swift 3.0の列挙、クラス、構造体

4353 ワード

  • 列挙構文
  • 形式:enum SomeEnumeration{//列挙定義はここに置く}
  • は、C/OCとは異なり、ここでの列挙メンバーの作成時にデフォルトの整数値が与えられない.すなわち、列挙メンバーは暗黙的に0,1,2...に割り当てられない.逆に、これらの列挙メンバー自体が完全な値である.
  • switch文を使用して列挙値をマッチング
  • 列挙タイプの値を判断するとき、switch文はすべての状況を窮屈にしなければならない.
  • 各列挙メンバーを一致させる必要がない場合、defaultブランチを提供して、明確に処理されていないすべての列挙メンバーをカバーすることができる.

  • 関連値enum Barcode{case UPCA(Int,Int,Int,Int)case QRCode(String)}var productBarcode=Barcode.UPCA(8, 85909, 51226, 3) productBarcode = .QRCode("ABCDEFGHIJKLMNOP") switchproductBarcode { case .UPCA(let numberSystem, let manufacturer, let product, let check): print("UPC-A:(numberSystem), (manufacturer), (product), (check).") case .QRCode(let productCode):print(「QR code:(productCode)」//印刷:QR code:ABCDEFGHIJKLMNOP
    switchproductBarcode {
      case let .UPCA(numberSystem, manufacturer, product, check):    
         print("UPC-A:\(numberSystem), \(manufacturer), \(product), \(check).")    
      case let .QRCode(productCode):    
         print("QR code: \(productCode)")
    }
     //  :
    QR code: ABCDEFGHIJKLMNOP
    
  • 元の値
  • 元の値は、文字列、文字、または任意の整数値または浮動小数点値であってもよい.各元の値は、列挙宣言で一意である必要があります.
  • 元の値と関連付けられた値は異なります.元の値は、列挙を定義するときに予め埋め込まれた値です.特定の列挙メンバーの場合、元の値は常に変更されません.関連付けられた値は、列挙メンバーの定数または変数に基づいて作成されたときに設定される値であり、列挙メンバーの関連付けられた値は変更できます.
  • 列挙メンバーのrowValue属性を使用して、列挙メンバーの元の値にアクセスします.
  • 元の値コンストラクタは、常にオプションの列挙メンバーを返します.注意:元の値コンストラクタは、元の値ごとに対応する列挙メンバーがあるわけではないため、失敗可能なコンストラクタです.

  • 再帰列挙
  • 関連値として1つ以上の列挙メンバーが使用します.再帰列挙を使用すると、コンパイラは間接レイヤを挿入します.メンバーを列挙する前にindirectを追加して、メンバーが再帰できることを表すことができます.
    //(5 + 4) * 2
    enum ArithmeticExpression{    
      case Number(Int)   
      indirect case Addition(ArithmeticExpression, ArithmeticExpression)   
      indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
    }
    let five = ArithmeticExpression.Number(5)
    let four = ArithmeticExpression.Number(4)
    let sum = ArithmeticExpression.Addition(five, four)
    let product = ArithmeticExpression.Multiplication(sum,                 
    ArithmeticExpression.Number(2))
    //          ,          。
    //             ,                  ,       。
    func evaluate(_ expression: ArithmeticExpression) -> Int{                              
    switch expression {   
       case .Number(let value):      
                return value   
       case .Addition(let left, let right):       
               return evaluate(left) + evaluate(right)  
       case .Multiplication(let left, let right):     
               return evaluate(left) * evaluate(right)   
             }
     }
    print(evaluate(product))
    


  • クラスと構造体の比較
  • 共通点:
  • は、値を格納するための属性を定義する.
  • は、機能を提供するための方法を定義する.
  • は、インスタンスに含まれる値にアクセスするために、インデックス構文によってインデックス操作を定義することができる.
  • は、初期化値を生成するためにコンストラクタを定義する.
  • は、デフォルトで実装される機能を追加するために拡張される.
  • プロトコルは、ある標準機能を提供するために実装される.

  • クラスの追加機能:
  • 継承は、あるクラスが別のクラスの特徴を継承することを可能にする.
  • タイプ変換により、実行時にクラスインスタンスのタイプをチェックおよび解釈できます.
  • アナライザは、クラスインスタンスが割り当てられたリソースを解放することを可能にする.
  • 参照カウントは、1つのクラスへの複数の参照を許可します.

  • 構造体は、参照カウントを使用せずに、常にコピーによってコードに伝達される.
  • クラス定義:class SomeClass{//class definition goes here}
  • 構造体定義:struct SomeStructure{//structure definition goes here}
  • 構造体およびクラスは、コンストラクタを使用して新しいインスタンスを生成します.コンストラクタ構文の最も簡単な形式は、構造体またはクラスのタイプ名の後に空カッコのペアに従うことです.
  • は、ポイント構文を使用してインスタンスのプロパティにアクセスします.
  • はOCとは異なり、Swiftは構造体属性のサブ属性を直接設定することができる.
  • すべての構造体には、新しい構造体インスタンスのメンバーのプロパティを初期化するために自動的に生成されたメンバー逐一コンストラクタがあります.ただし、クラスインスタンスにはデフォルトのメンバーコンストラクタはありません.

  • 構造体および列挙値タイプ
  • Swiftでは、すべての構造体および列挙タイプが値タイプである.これは、インスタンス、およびインスタンスに含まれる任意の値タイプ属性が、コードに渡されるとコピーされることを意味します.

  • クラスは参照タイプです
  • 参照タイプが変数、定数、または関数に割り当てられた場合、その値はコピーされません.したがって、コピーではなく既存のインスタンス自体が参照されます.
  • "=="は、2つのクラスタイプ(class type)を表す定数または変数が同じクラスインスタンスを参照することに等しい."=="は、2つのインスタンスを表す値が等しいか同じかに等しい.
  • クラスと構造体の選択
  • 構造体適用シナリオ:
  • このデータ構造の主な目的は、少量の関連する単純なデータ値をカプセル化することである.
  • は、データ構造のインスタンスが付与または伝達されると、参照ではなくカプセル化されたデータがコピーされると予想する理由がある.
  • データ構造に格納されている値タイプ属性も、参照されるのではなくコピーされるべきである.
  • データ構造は、別の既存のタイプの属性または動作を継承する必要はありません.

  • 他のすべてのケースでは、クラスを定義し、そのインスタンスを生成し、参照によって管理および転送します.実際、これは、ほとんどのカスタムデータ構造が構造体ではなくクラスであるべきであることを意味します.