列挙型は、単純な整数の計算をする演算子のように、考慮が必要な数が決まっている場合にデータをモデル化するのに適しています。これらの演算子で、5 のような整数で構成される単純な式を、5 + 4 のようなより複雑な演算式に結合します。

演算式の重要な特徴の一つは、ネストできることです。例えば、(5 + 4) * 2 には掛け算の右側に数値があり、掛け算の左側には別の式があります。データがネストされているため、データを保持する列挙型は、ネストもサポートする必要があります。つまり、列挙型は再帰的である必要があります。

再帰列挙型は、列挙型のケースの関連値として、列挙型の別のインスタンスを持ちます。コンパイラは、再帰列挙型を扱うときに、間接レイヤーを挿入しなければいけません。indirect と記述して列挙型のケースが再帰的であることを示します。

次の例は、シンプルな演算式を保持する列挙型です。

enum ArithmeticExpression {
    case Number(Int)
    indirect case Addition(ArithmeticExpression, ArithmeticExpression)
    indirect case Multiplication(ArithmeticExpression, ArithmeticExpression)
}

列挙型のすべてのケースを間接とする必要がある場合には、列挙型の初めに indirect と記述することもできます。

indirect enum ArithmeticExpression {
    case Number(Int)
    case Addition(ArithmeticExpression, ArithmeticExpression)
    case Multiplication(ArithmeticExpression, ArithmeticExpression)
}

この列挙型は、3 種類の演算式である数値、加算、乗算を保持することができます。Addition と Multiplication のケースには演算式である関連値があり、式をネストすることができます。

再帰関数は、再帰構造を持つデータを扱う理解しやすい手段です。次の例は、演算式を評価しています。

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)
    }
}

// (5 + 4) * 2 を評価
let five = ArithmeticExpression.Number(5)
let four = ArithmeticExpression.Number(4)
let sum = ArithmeticExpression.Addition(five, four)
let product = ArithmeticExpression.Multiplication(sum, ArithmeticExpression.Number(2))
print(evaluate(product))
// "18" と出力

この関数は、関連値を単に返して数値を評価しています。左型の式を評価し、右側の式を評価して、それらを加算して足し算を評価し、それらを乗算して掛け算を評価しています。


Portions of this page are translations based on work created and shared by Apple and used according to terms described in the Creative Commons Attribution 4.0 International License.