티스토리 뷰
연산 프로퍼티를 사용해서 뷰컨트롤러에서의 코드 줄임.
수정 전
struct Status: Codable {
var level: Int
var food: Int
var water: Int
}
수정 후
struct Status: Codable {
var food: Int
var water: Int
var typeNumber: String = "0" // 다마고치별 이미지 앞 숫자
var level: Int {
get {
let exp = (Double(food) / 5) + (Double(water) / 2)
switch exp {
case 0..<20 :
return 1
case 20..<30 :
return 2
case 30..<40 :
return 3
case 40..<50 :
return 4
case 50..<60 :
return 5
case 60..<70 :
return 6
case 70..<80 :
return 7
case 80..<90 :
return 8
case 90..<100 :
return 9
case 100... :
return 10
default:
return 0
}
}
}
var statusLabel: String {
get {
return "LV\(level) · 밥알 \(food)개 · 물방울 \(water)개"
}
}
var profileImg: String {
get {
return typeNumber + "-\(level)"
}
set {
typeNumber = newValue
}
}
}
구조체의 코드는 길어짐.
하지만 메인 코드에서 코드를 줄일 수 있었음.
수정 전
if let exp = exp, let tamaData = tamaData {
if exp < 20 && exp >= 0 {
level = 1
profileImg.image = UIImage(named: "\(tamaData.number)-\(level)")
} else if exp >= 20 && exp < 100 {
level = Int(exp / 10)
profileImg.image = UIImage(named: "\(tamaData.number)-\(level)")
} else if exp >= 100 {
level = 10
profileImg.image = UIImage(named: "\(tamaData.number)-9")
} else {
showAlert(title: "레벨 오류입니다.")
}
}
statusLabel.text = "LV\(statusData.level) · 밥알 \(statusData.food)개 · 물방울 \(statusData.water)개"
수정 후
currentStatus?.typeNumber = "\(tamaData!.number)"
profileImg.image = UIImage(named: currentStatus!.profileImg)
statusLabel.text = statusData.statusLabel
예외에 대해서 전부 다 처리했기때문에 옵셔널을 !을 이용해 강제로 벗기긴했음.
if let을 이용하면 코드가 조금 더 길어지겠지만 훨씬 안전할듯.
_____________________________________________________________________________________________________
생각해보니 계속 if let만 습관적으로 쓰다보니 if var도 가능하다는 것을 잊고있었음..
if var를 이용해서 조금 더 길지만 안전하게 다시 작성해봄.
바보였음.
계속해서 옵셔널을 벗기려고만 노력했는데 가장 기본적인 부분을 생각하지않았음.
구조체에서 초기값을 설정하지않아서 옵셔널로 된거였음.
그래서 아예 구조체에서 값을 설정해줌.
struct Tamagotchi: Codable {
var profileImg: String = ""
var name: String = ""
var detail: String = ""
var number: Int = 0
}
struct Status: Codable {
var food: Int = 0
var water: Int = 0
var typeNumber: String = "0" // 다마고치별 이미지 앞 숫자
var level: Int {
get {
let exp = (Double(food) / 5) + (Double(water) / 2)
switch exp {
case 0..<20 :
return 1
case 20..<30 :
return 2
case 30..<40 :
return 3
case 40..<50 :
return 4
case 50..<60 :
return 5
case 60..<70 :
return 6
case 70..<80 :
return 7
case 80..<90 :
return 8
case 90..<100 :
return 9
case 100... :
return 10
default:
return 0
}
}
}
var statusLabel: String {
get {
return "LV\(level) · 밥알 \(food)개 · 물방울 \(water)개"
}
}
var profileImg: String {
get {
if level < 10 && level >= 1 {
return typeNumber + "-\(level)"
} else if level >= 10 {
return typeNumber + "-9"
} else {
return "noImage"
}
}
set {
typeNumber = newValue
}
}
}
위처럼 선언하고 메인화면에서 인스턴스를 생성해서 값에 접근하였음.
그 결과 아래처럼 옵셔널 해제가 필요없이 사용할 수 있었음.
currentStatus.typeNumber = "\(tamaData.number)"
profileImg.image = UIImage(named: currentStatus.profileImg)
statusLabel.text = currentStatus.statusLabel
물론 위의 코드말고도 물주기, 밥주기 버튼도 코드가 조금 더 깔끔해졌음.
______________________________________________________________________________________________________
코드를 수정하다보면 잘못된 것이 조금씩 보이는 것 같음. 물론 아직까진 사소한 부분밖에 못봄.
'코드수정' 카테고리의 다른 글
[코드 수정] TMDB 프로젝트 코드 수정 (0) | 2022.08.06 |
---|---|
[코드 수정] 다마고치 과제 코드 수정 (0) | 2022.08.02 |
[코드 수정] 다마고치 과제 코드 수정 (0) | 2022.07.31 |
[코드 수정] 감정 다이어리, 기념일 계산기 코드 수정 (0) | 2022.07.19 |
[코드 리뷰] 감정 다이어리, 기념일 계산기 코드 수정 (0) | 2022.07.19 |
댓글
최근에 올라온 글
- Total
- Today
- Yesterday