列挙型は、単純な整数の計算をする演算子のように、考慮が必要な数が決まっている場合にデータをモデル化するのに適しています。これらの演算子で、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.