포스트

BMI Calculator (4)

Model 만들기

먼저 파일을 만들어 준다.

CalculatorBrains으로 만들어 주었다.

일단은 struct만 만들어 주었다.

1
2
3
struct CalculatorBrain {

}

ViewController에 초기화 및 내용 수정

이전에 Viewcontroller에 실제로 사용하던 변수들을 이제 structure에 넣으면서 하나씩 바꿀 예정이다.

1
2
// CalculatorViewController
var calculatorBrain = CalculatorBrain()

이렇게 초기화를 해주고,

1
2
3
4
5
// CalculatorViewController, calculatePressed
calculatorBrain.calculateBMI(height: height, weight: weight)

// prepare
destinationVC.bmiValue = calculatorBrain.getBMIValue()

이렇게 해주었다.

structure에 어떤 값이 들어갈지 내부값을 하나씩 변경해주면서 디자인을 해보자

Model 내용 추가

현재 calculateBMI, getBMIValue라는 함수를 추가해주고 기존 값을 지웠다. 즉 우리는 저 함수를 structure에 추가 해주면 되겠다.

일단 다음과 같이 작성을 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
struct CalculatorBrain {   
    var calculatedBMIValue : String = ""
    
    mutating func calculateBMI(height : Float, weight : Float) -> String{
        calculatedBMIValue = String(format: "%.1f", (weight / (height * height)))
        
        return calculatedBMIValue
    }
    
    func getBMIValue() -> String {
        
    return calculatedBMIValue}
}

CalculateViewController에 다음과 같은 창이 경고가 뜬다, 저번에 Quizzler때도 그랬다.

리턴을 하지말고 계산만 하게 해볼까? 라는 생각이 들어

1
2
3
4
mutating func calculateBMI(height : Float, weight : Float){
        calculatedBMIValue = String(format: "%.1f", (weight / (height * height)))
        
    }

리턴을 하지않고 계산만 하게 해보았다.

잘된다.

그래서 내가 쓴 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import Foundation

struct CalculatorBrain {
    
    var calculatedBMIValue : String = ""
    
    mutating func calculateBMI(height : Float, weight : Float){
        calculatedBMIValue = String(format: "%.1f", (weight / (height * height)))
        
    }
    
    func getBMIValue() -> String {
        
        return calculatedBMIValue
    }
}

그냥 calculateBMIValue는 계산만하게 해도 되는건데 굳이 리턴을 하려고 하니 warning 이떴던 것이었다.

어차피 structure에서 value를 getBMIValue로 받으니 리턴이 필요없다.


강의에선 다음과 같이 하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
struct CalculatorBrain {
    
    var bmi : Float = 0.0
    
    mutating func calculateBMI(height : Float, weight : Float){
        bmi = weight / (height * height)
    }
    
    func getBMIValue() -> String {
        let bmiTo1DecimalPlace = String(format: "%.1f", bmi)
        return bmiTo1DecimalPlace
    }
}

structure 에서 initialization을 하지않은 이유.

struct CalculatorBrain에서

1
2
3
bmi : Float = 0.0 //강의
calculateBMIValue : String = "" //나

이런식으로 먼저 값을 적고 했다.

그 이유는 우리가 그냥

1
2
bmi : Float 
calculateBMIValue : String  //나

이런식으로 표현을 하게 될경우

calculate 뷰 컨트롤러에서는

1
var calculatorBrain = CalculatorBrain( )

여기 괄호안에 우리가 매개변수를 넣어줘야한다.

하지만 굳이 우리가 여기 컨트롤러에서 값을 초기화 해줄 필요가 전혀 없다.

구조체에서 이미 값을 계산을 하고, 가져 올 수 있기 때문이다.

그렇다면.

1
2
bmi : Float = nil
calculateBMIValue : String = nil

이렇게 nil일 경우를 생각해서

1
2
3
bmi : Float?
calculateBMIValue : String?

옵셔널을 한다면??

1
2
3
4
func getBMIValue() -> String {
        let bmiTo1DecimalPlace = String(format: "%.1f", bmi!)
    
    }

이렇게 ! 를 여태 붙이듯이 해야할것이다.

그렇게 했을때 실행을 하면 어떻게 될까?

앱을 실행하자마자 nil값을 얻기 위해

calculate뷰 컨트롤러의 코드를 잠깐 수정한다.

1
2
3
4
5
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        calculatorBrain.getBMIValue()
    }

바로 작동하자마자 bmivalue를 얻게 해보았다.

다음과 같이 시작하자마자 팅기면서 에러가 발생한다.

viewDidLoad()를 통해 앱이 구동되자마자 getBMIValue를 하게되는데 nil값을 가져오기 때문이다.

다음 글에서 계속 서술하도록 하겠다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.