見出し画像

SwiftUIで行こう! 電卓を作ろ!-効率的に!

仕組みを整理していき効率よく計算ができるようにします。。以下参考にしています。

https://www.youtube.com/watch?v=hBO81LgQcJM

ここではまず記号が入力された場合にすることが決めてある部分を再定義していきます。

別ファイル管理として、CalcBrain.swiftというファイルを作ります。

構造としては以下

struct CalcBrain {

    var accumulator:Double?

    func performOperation(_ symbol:String){
      
   }

    func setOperand(_ operand:Double){
      accumulator = operand
   }
   
   var result:Double?{
      get {
           return accumulator
       }
   }
}

としています。

新しい変数

var accumulator:Double?

を作ってまずは値をこの変数に入れて、

var result:Double?{
  get {
return accumulator
}
}

で最終的には 変数"result"に入れて、表示部分にデータを引き渡します。

struct UnarySymbols:View{}の

func performOperation(_ symbol:String){

}

の中身、以前に作っていたswitch文です。

 switch symbol {
           case "π":
               calcVM.displayValue = Double.pi
               calcVM.middleTyping = false
           case "√":
               calcVM.displayValue = sqrt(calcVM.displayValue)
               calcVM.middleTyping = false
           default:
               break
           }

別ファイルで作ったstruct CalcBrain {}を編集します。

func performOperation(_ symbol:String){


}

同じ名前の関数に入れます。

func performOperation(){}を変更していきます。

 mutating func performOperation(_ symbol:String){
       switch symbol {
           case "π":
               accumulator = Double.pi
           case "√":
               if let operand = accumulator{
                   accumulator  = sqrt(operand)      
           default:
               break
           }
   }

そしてstruct UnarySymbols:View{}を別ファイルのCalcBrainを使えるようにします。

@Binding var brain:CalcBrain

Button(mathSymbol,action:{})のコードをCalcBrainのメッソドに変更します。

 self.brain.setOperand(self.calcVM.displayValue){
         self.calcVM.middleTyping = false
         self.brain.setOperand(self.calcVM.displayValue)
         self.brain.performOperation(mathSymbol)
         if let result = self.brain.result{
         self.calcVM.displayValue = result
         }
self.brain.setOperand(self.calcVM.displayValue)

で表示されている値をセットします。

self.brain.performOperation(mathSymbol)

で演算、計算されて表示します。

if let result = self.brain.result{
self.calcVM.displayValue = result

ここで、

 var result:Double?{
       get {
           return accumulator
       }
   }

これで、accumulatorからresultへデータを代入してデータを

self.calcVM.displayValue

に代入することで表示される仕組みです。

注意点ですがstruct ContentView: View{}UnarySymbols()の中のコードで

UnarySymbols() → UnarySymbols(brain: $brain)

と変更しておかないとエラーが出ます。

ここまでで大部分struct CalcBrain {}を利用したコードの書き換えは終わりです。

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