Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

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アックをタプルで返しています。

今日はここまで。