Swift로 계산기 만들기 #4 - 계산기 모델 만들기

반응형

New File을 선택하여 Swift File을 선택한다.

File Name에 CalculartorBrain을 입력하고 Create 버튼을 클릭한다.

다음과 같이 파일이 생성되었다.

아래와 같이 코드 에디터 창을 나란히 놓고 작업하면 편하다.

 

CalculartorBrain.swift 파일에 다음 내용을 작성한다.

import Foundation

class CalculatorBrain {
    func setOperand(operand: Double) {}
    
    func performOperaion(symbol: String) {}

    var result: Double {
        get {
            return 0.0
        }
    }
}

 

다음 기능을 통해서 Interface를 볼수 있다. 

 

함수와 변수 앞에 private를 붙이게 되면 public API가 없기 때문에 인터페이스에는 코드가 모두 사라진다.

CalculatorBrain 파일의 내용을 다음과 같이 수정합니다.

class CalculatorBrain {
    
    private var accumulator = 0.0
    
    func setOperand(operand: Double) {
        accumulator = operand
    }
    
    func performOperaion(symbol: String) {
        switch symbol {
        case "π": accumulator = Double.pi
        case "√": accumulator = sqrt(accumulator)
        default: break
        }
    }

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

단축키 Control + I를 누르면 코드 자동 포맷팅이 됩니다.

 

그리고 다시 ViewController 로 돌아와서 performOperation 함수를 아래와 같이 수정합니다.

    private var brain = CalculatorBrain()

    @IBAction private func performOperation(_ sender: UIButton) {
        if userIsTheMiddleOfTyping {
            brain.setOperand(operand: displayValue)
            userIsTheMiddleOfTyping = false
        }
        if let mathmaticalSymbol = sender.currentTitle {
            brain.performOperaion(symbol: mathmaticalSymbol)
        }
        displayValue = brain.result
    }

userIsTheMiddleOfTyping 가 True(사용자가 입력 중) 일 때는, CalculatorBrain에 디스플레이된 값을 setOperand에 전달 합니다.

userIsTheMiddleOfTyping 가 False 일 때는, CalculatorBrain에 심볼값을 performOperaion에 전달합니다.

 


 

지금까지 작성한 전체 코드는 다음과 같다.

//
//  CalculatorBrain.swift
//  Calculator
//
//  Created by anpigon on 2020/07/12.
//  Copyright © 2020 anpigon. All rights reserved.
//

import Foundation

class CalculatorBrain {
    
    private var accumulator = 0.0
    
    func setOperand(operand: Double) {
        accumulator = operand
    }
    
    func performOperaion(symbol: String) {
        switch symbol {
        case "π": accumulator = Double.pi
        case "√": accumulator = sqrt(accumulator)
        default: break
        }
    }

    var result: Double {
        get {
            return accumulator
        }
    }
}
//
//  ViewController.swift
//  Calculator
//
//  Created by anpigon on 2020/07/11.
//  Copyright © 2020 anpigon. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet private weak var display: UILabel!
    
    private var userIsTheMiddleOfTyping = false

    @IBAction private func touchDigit(sender: UIButton) {
        let digit = sender.currentTitle!
        if userIsTheMiddleOfTyping {
            let textCurrentInDisplay = display.text!
            display.text = textCurrentInDisplay + digit
        } else {
            display.text = digit
        }
        userIsTheMiddleOfTyping = true
    }
    
    private var displayValue: Double {
        get {
            return Double(display.text!)!
        }
        set {
            display.text = String(newValue)
        }
    }
    
    private var brain = CalculatorBrain()

    @IBAction private func performOperation(_ sender: UIButton) {
        if userIsTheMiddleOfTyping {
            brain.setOperand(operand: displayValue)
            userIsTheMiddleOfTyping = false
        }
        if let mathmaticalSymbol = sender.currentTitle {
            brain.performOperaion(symbol: mathmaticalSymbol)
        }
        displayValue = brain.result
    }
}

반응형