오늘 계산기 때문에 불태운 날이 된거 같다.
오랜만에 코딩을 해서 기분이 아주 좋았다.
잘 풀리기 까지 했다면 기분은 더 좋았을 거라 생각하지만
아직 연습이 너무 많이 필요하고 모르는게 너무 많아서... 공부합시다.
다시 차근차근 되 살펴 보기
계산기 2번 만들어 보기.
class Calculator {
var input1: String
var input2: String
var operators: String
var dobleInput1: Double? {return Double(input1)}
var dobleInput2: Double? {return Double(input2)}
init(input1: String, input2: String, operators: String) {
self.input1 = input1
self.input2 = input2
self.operators = operators
}
func oper() -> Double {
if operators == "+" {
guard let dobleInput1 = cal.dobleInput1 , let dobleInput2 = cal.dobleInput2 else {
return 0
}
return dobleInput1 + dobleInput2
} else if operators == "-" {
guard let dobleInput1 = cal.dobleInput1 , let dobleInput2 = cal.dobleInput2 else {
return 0
}
return dobleInput1 - dobleInput2
} else if operators == "*" {
guard let dobleInput1 = cal.dobleInput1, let dobleInput2 = cal.dobleInput2 else {
return 0
}
return dobleInput1 * dobleInput2
} else if operators == "/" {
guard let dobleInput1 = cal.dobleInput1 , let dobleInput2 = cal.dobleInput2 else {
return 0
}
return dobleInput1 / dobleInput2
} else if operators == "%" {
guard let dobleInput1 = cal.dobleInput1 , let dobleInput2 = cal.dobleInput2 else {
return 0
}
return dobleInput1.truncatingRemainder(dividingBy: dobleInput2)
}
return 0
}
}
let cal = Calculator(input1: "30", input2: "8", operators: "-")
cal.oper()
나는 일단 if 문을 통해서 입력받을 것을 통해서 계산하도록 만들어 봤다.
근데 반복되는 저게 너무 보기 싫은데 어떻게 코드를 줄일지는 주말에 고민해봐야 될거 같다.
그리고 여기서 처음 배운게 있다.
나머지 같은경우 Double 형태는 그냥 안된다 truncatingRemainder 사용해야지 계산이 되더라 꼭 기억하자
계산기 3 만들어 보기 ~
class Calculator {
var input1: String
var input2: String
var deInput1: Double? {return Double(input1)}
var deInput2: Double? {return Double(input2)}
init(input1: String, input2: String) {
self.input1 = input1
self.input2 = input2
}
}
class AddOperation {
func operate() -> Double {
guard let addinput1 = cal.deInput1 , let addinput2 = cal.deInput2 else {
return 0
}
return addinput1 + addinput2
}
}
class SubtractOperation {
func operate() -> Double {
guard let addinput1 = cal.deInput1 , let addinput2 = cal.deInput2 else {
return 0
}
return addinput1 - addinput2
}
}
class MultiplyOperation {
func operate() -> Double {
guard let addinput1 = cal.deInput1 , let addinput2 = cal.deInput2 else {
return 0
}
return addinput1 * addinput2
}
}
class DivideOperation {
func operate() -> Double {
guard let addinput1 = cal.deInput1 , let addinput2 = cal.deInput2 else {
return 0
}
return addinput1 / addinput2
}
}
let cal = Calculator(input1: "10", input2: "20")
let addResult = AddOperation()
let subtractResult = SubtractOperation()
let multiplyResult = MultiplyOperation()
let divideResult = DivideOperation()
addResult.operate()
subtractResult.operate()
multiplyResult.operate()
divideResult.operate()
print("addResult : \(addResult.operate())")
print("subtractResult : \(subtractResult.operate())")
print("multiplyResult : \(multiplyResult.operate())")
print("divideResult : \(divideResult.operate())")
요거 또한 별 생각없이 클래스만 나누어 줬기 때문에
큰 어려움은 없었다.
4단계 만들어 보기
class Calculator {
var input1: String
var input2: String
var deInput1: Double? {return Double(input1)}
var deInput2: Double? {return Double(input2)}
init(input1: String, input2: String) {
self.input1 = input1
self.input2 = input2
}
// guard let 반복사용 하고 싶어서 함수를 구현해봄
func operators() -> Double {
guard let deInput1 = cal.deInput1 , let deInput2 = cal.deInput2 else {
return 0
}
return deInput1 + deInput2
}
}
class AddOperator: Calculator {
override func operators() -> Double {
guard let deInput1 = cal.deInput1 , let deInput2 = cal.deInput2 else {
return 0 // 부모 클래스를 끌고 와도 재정의 할려면 다 다시 해야된다는거 같아서 시도해봄 잘 돌아간다.
}
return deInput1 + deInput2
}
}
class SubOperator: Calculator {
override func operators() -> Double {
return deInput1! - deInput2! // guard let 반복하고 싶지 않아서 이렇게 만들어 보았지만 nil 값이 들어가면 오류가 뜬다.
}
}
class DivOperator: Calculator {
override func operators() -> Double { // 여기도 마찬가지 초기 cal 변수 경로를 지정해서 영향은 부모 클래스에 받지만 nil 경우 오류가 뜬다.
return cal.deInput1! / cal.deInput2!
}
}
class MulOperator: Calculator {
override func operators() -> Double {
return cal.deInput1! * cal.deInput2!
}
}
let cal = Calculator(input1: "10", input2: "10")
let addresult = AddOperator(input1: "", input2: "") // nil 값에서도 작동 init 초기화가 필요한지 무조건 초기값을 넣어줘야하더라. 위에 함수에서 변수가 부모 클래스로 정의 했으면 위에 클래스 init 초기값에 영향을 받는다.
let Subresult = SubOperator(input1: "2", input2: "2") // nil 값에서 오류 발생
let Divresult = DivOperator(input1: "", input2: "")
let Mulresult = MulOperator(input1: "", input2: "")
addresult.operators()
Subresult.operators()
Divresult.operators()
Mulresult.operators()
4단계를 하면서 진짜 진짜 다양하고 많이 해보았지만
원하던 것은다 실패했다.... 처절하다
나는 상속을 시키면 함수의 기능도 가져오지만
마지막 return 값만 변경하고 싶어서 위에 subresult 처럼 구현을 했었다.
그런데 return 값은 가기는 하는데 nil 값에 대처를 못하더라... 퍽킹
그리고 상속을 받아서인지 자식 클래스 들이 init 사용할 수 밖에 없는...
처음 부모 클래스에서 init 사용해서 인지
암튼 다양한 방식으로 처리가 돌아가는걸 보기는 했지만 원하는 결과는 못 얻었다.
내가 원한건 guard let 문을 재활용 하는것 반복적으로 안적고
아무튼 더 공부를 해야될 거 같다. 모르는게 넘 많다