Swift学習(七:列挙)

3592 ワード

1.列挙構文
    enum Some{
            //    
    }

    enum Someone{
            case north
            case south
            case east
            case west
    }

複数のメンバー値をカンマで区切って同じ行に表示できます.
    enum Some{
            case north,south,east,west
    }
                   :
    var aa = Some.east
      : var aa = .east

2.Switch文を使用して列挙を照合する
    aa = .east
    switch aa{
            case .north:
                   print()
             case .south:
                   print()
             case .east:
                   print()
             case .west:
                   print()
     }

3.関連値
列挙を定義するときに、メンバー変数に関連する値を設定できます.
    enum some{
            case aa(Int,Int,Int,Int)
            case bb(String)
    }
      :var cc = some.aa(1,2,3,4)
        : var cc = .aa(1,2,3,4)

関連値はswitch文の一部として抽出できます.switchのcaseブランチコードでは、各関連値を定数(let接頭辞)として抽出するか、変数(var接頭辞)として使用できます.
    switch cc{
            case aa(let a,let b,let c,let d):
                      print(a,b,c,d)
            case bb(let str)
                       print(str)
    }

列挙メンバーのすべての関連値が定数として抽出されたり、変数として抽出されたりする場合は、簡潔にするために、メンバー名の前にletまたはvarを1つだけマークできます.
    switch cc{
            case let aa( a, b,c, d):
                      print(a,b,c,d)
            case let bb( str)
                       print(str)
    }

4.元の値
  • 元の値の暗黙的な割り当て元の値が整数または文字列タイプの列挙を使用する場合、列挙メンバーごとに元の値を明示的に設定する必要はありません.swiftは自動的に値を割り当てます.整数を元の値として使用すると、暗黙的に付与された値は順次1ずつ増加し、最初の列挙メンバーが元の値を設定していない場合、その元の値が0
      enum aa :Int{
              case a = 1, b , c , d
      }
    
    Stringの列挙メンバーの列挙値はそれ自体である.列挙メンバーのrawValueプロパティを使用して、列挙メンバーの元の値
    let b = aa.b.rawVlaue       //2
    
  • にアクセスできます.
  • 元の値を使用する初期化列挙例
      enum aa :Int{
              case a = 1, b , c , d
      }
      let b = aa(rawValue:3)
      //b      aa,  c
    
  • 注意、左右の値が一致する列挙メンバーを見つけることができるわけではありません.したがって、元の値コンストラクタは常に の列挙メンバーを返します.元の値コンストラクタは失敗可能なコンストラクタです.すべての元の値に対応する元の値があるわけではありません.ない場合はnilです.
    5.再帰列挙
    は、関連する値として1つ以上の列挙メンバーが使用する列挙タイプのインスタンスです.再帰列挙を使用すると、コンパイラは中間層を挿入し、列挙メンバーの前にindirectを追加してメンバーが再帰可能であることを示すことができます.
        enum ArithmeticExpression {
              case Number(Int)
              indirect case Addition(ArithmeticExpression,       ArithmeticExpression)
              indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
          }
    

    または
        indirect enum ArithmeticExpression {
              case Number(Int)
              case Addition(ArithmeticExpression, ArithmeticExpression)
              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))
          //    "18"