Swiftで遊ぼう! - 223 - Developing iOS 8 Apps with Swift - Applying MVC 計算ブロック
Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide
やっとevaluate()関数の実装できそうだ。
BinaryOperationのパターンが残っているけど、基本的にUnaryOpaerationと同じで、スタックからオペランドを2つとてくるかどうかだ。
まとめると、次のようになる。func宣言の前にprivateが付いているけど、引数のOpがprivate宣言しているので関数もprivateにしてないとエラーになるからです。
private 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(_, let operation): let operandEvaluation = evaluate(remainingOps) if let operand = operandEvaluation.result { return (operation(operand), operandEvaluation.remainingOps) } case .BinaryOperation(_, let operation): let op1Evaluation = evaluate(remainingOps) if let operand1 = op1Evaluation.result { let op2Evaluation = evaluate(op1Evaluation.remainingOps) if let operand2 = op2Evaluation.result { return (operation(operand1, operand2), op2Evaluation.remainingOps) } } } } return (nil, ops) }
こういうコードブロックも理解できるようになったので少し進歩はしれるんでしょうね。
最後にopStackを評価する引数の取らないevaluate()を実装しておく。
func evaluate() -> Double? { let (result, remainder) = evaluate(opStack) return result }
次はこのCalculatroBrainとユーザーインターフェイスを繋げていく。まさにMVCモデルをプログラミングで実現って事です。
今日はここまで。