티스토리 뷰

연산 프로퍼티를 사용해서 뷰컨트롤러에서의 코드 줄임.

 

수정 전

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

 

물론 위의 코드말고도 물주기, 밥주기 버튼도 코드가 조금 더 깔끔해졌음.

 

 

______________________________________________________________________________________________________

 

 

코드를 수정하다보면 잘못된 것이 조금씩 보이는 것 같음. 물론 아직까진 사소한 부분밖에 못봄.

댓글
최근에 올라온 글
Total
Today
Yesterday