Swiftで遊ぼう!の古い記事-> Life-LOG OtherSide

本当に理解するのが滅茶難しい。というか説明を聞いている時は何となく理解できても一人で復習を始めると訳がわからなくなる。

再帰法で評価する方法の概要を昨日話したので、実際のコーディングで勉強していこう。

まず、evaluate()関数であるが、これで評価するのはスタックなので、「Op」型のアレーを引数として受け取って、結果と残りのスタックの2つの戻り値を返す関数にしてやる。

func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]) {
 // coding continue... 
}

まず、こういう関数を作る時、アレーが空っぽだった時の例外処理を作らなければならない。

常套手段なんでしょう。次のコードをサッと入れておきましょう。

func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]) {
 if !ops.isEmpty {
 // coding continue... 
  }
 return (nil, ops)
}

「ops」が空だったらresultにnilを返して、remainingOpsに空のopsをそのまま返す。

「(!)(.isEmpaty)」は空じゃ無いという2重否定になるので、何かあればif節が実行されます。

スタック(アレー)の一番ラスト(1番上)の項目を取り出すメソッドが用意されています。覚えていますか?「.removeLast()」を使います。

let op = ops.removelast()

ぶぶぶー(`ヘ´)

実は引数で取り込むopsは変更できないのでエラーになるんです。講座では「func evaluate(var ops: [Op])〜」なんて回避法も説明してたけど、美しくないので却下されていました。

コピーをすする方法が示されてました。コピーを繰り返すと実行速度が遅くなるんじゃないかという質問が出てましたが、Swiftはこういうところで本当のコピーが生じないので心配ないんだって。

func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op]) {
 if !ops.isEmpty {
  var remainingOps = ops
  let op = remainingOps.removeLast()
 // coding continue... 
 }
 return (nil, ops)
}

さあ、これでスタックの1番上の項目が「op」に収まりましたね

ということで今日はここまで。