見出し画像

Swiftで行こう!--スタンフォードで電卓!5 MVC-1

コードを構造的にするために、ファイルを分けていきます。

MVCとはModel,View,Controllerという機能面から分けて行こうということです。

    @IBAction func performOperation(_ sender: UIButton) {
       userIsMiddleOfTyping = false
       
       if let mathematicalSymbol = sender.currentTitle{
           switch mathematicalSymbol {
           case "π":
               displayValue = Double.pi
           case "√":
               displayValue = sqrt(displayValue)
           default: 
               break
           }
       }
   }

このボタン、算術式のボタンを押した時の挙動、計算をさせる部分を別ファイルで管理します。

まず新しいファイルを作ります。そして、

struct CaluculatorBrain {}

struct 構造体で必要な関数を定義していきます。

func performOperation{}  ・・・算術式を指定、計算
func setOperand(_ operand:Double){} 
            ・・・displayValueとaccumulatorとの橋渡し。
var result:Double?{} ・・・最終結果を入れる変数。

まず、表示させる値を保持する変数displayValueの値を accumulatorという変数に入れていきます。

そして実際の値を算出する関数の取得についてはswich構文をそのまま持ってきて少し変更します。具体的には、displayValueを accumulatorに変更してつつ、エラーの処理を一つずつ解決していく感じで直していきます。

説明しにくいので以下コードを載せます。

struct CaluculatorBrain {
   private var accumulator:Double?
   
   mutating func performOperation(_ symbol:String){
       switch symbol {
       case "π":
           accumulator = Double.pi
       case "√":
           if let operand = accumulator{
           accumulator = sqrt(operand)
           }
       default:
           break
       }
   }
   
   mutating func setOperand(_ operand:Double){
       accumulator = operand
   }
   
   var result:Double?{
       get{
           return accumulator
       }
   }
}

別ファイルはこれで良いとして、元のViewControllerはというと、

まず、

private var brain = CaluculatorBrain()

として、インスタンスを作りそれを持ってコードを書いていきます。

数字を打っているdisplayValueは算術式のボタンを押すことで、

brain.setOperand(displayValue)

としてaccumulatorに値が入っていきます。それと同時に

if let mathematicalSymbol = sender.currentTitle{
brain.performOperation(mathematicalSymbol)
}

ということで、CaluculatorBrain()の

switch symbol{}

での処理が始まります。

そして最後に

if let result = brain.result{
displayValue = result
}

ということで、displayValueに値が渡り表示されます。

  private var brain = CaluculatorBrain()

   @IBAction func performOperation(_ sender: UIButton) {
       if userIsMiddleOfTyping{
           brain.setOperand(displayValue)
           userIsMiddleOfTyping = false
       }
       if let mathematicalSymbol = sender.currentTitle{
          brain.performOperation(mathematicalSymbol)
       }
       if let result = brain.result{
       displayValue = result
       }
   }


この記事が気に入ったらサポートをしてみませんか?