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
}
}