Swiftで遊ぼう! - 222 - Developing iOS 8 Apps with Swift - Applying MVC 再帰関数
Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide
func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]) { if !ops.isEmpty { var remainingOps = ops let op = remainingOps.removeLast() switch op { case .Operand(let operand): return (operand, remainingOps) case .UnaryOperation // coding continue case .BinaryOperation // coding continue } } return (nil, ops) }
「op」が.UnaryOperationの場合の処理を考えよう。アソシエーションバリューはタプル型ですが、最初のString型が何であるか知る必要は無いので、「_」アンダーラインを使う。ポール先生に言わせれば、アンダーラインは「Universal I don't care about this thing」ということでワイルドカードのように使える。
case .UnaryOperation(_, let operation): let operandEvaluation = evaluate(remainingOps) if let operand = operandEvaluation.result { return (operation(operand), operandEvaluation.remainingOps) }
.UnaryOperationの関数部分のアソシエーションバリューのみ定数operationに取り込んで利用する。
そして次のコードで再帰を利用していますね。
最初のevaluate()関数に入ると、スタックの1番上のDouble?のアイテムが取り出されて、残りのスタックがremainingOpsとして残っているから、その残りのスタックを再びevaluate()関数に入れて次にくるDouble?を取りだして、それを定数operandに入れてますね。
そして、これをif節にするのはプログラミングのテクニック(プログラマーには当たり前のことですが、私には新鮮(笑))で、Double型が存在しなかったらnilになるので、ifの中のコードは実行されないですね。
そして、このoperandをoperationで計算させた結果と残っているSTアックをタプルで返しています。
今日はここまで。