iOS/Swift

[iOS] Swift - enum (2)

듀IT 2021. 11. 20. 01:04

enum(1): https://dew-it.tistory.com/59

Associated Values (연관 값)

Swift의 enum 객체의 멤버와 각 값은 객체 선언 시점에 정의된다. 즉 컴파일 시점에 enum 멤버의 정의와 값이 고정된다.

그렇지만 값을 사용하는 시점, 즉 런타임 시점에 보조값을 할당할 수도 있다. 이러한 보조값을 Associated Values라고 부른다.

enum ImageFormat {
    case JPEG
    case PNG (Bool)
    case GIF(Int, Bool)
}

var newImage = ImageFormat.PNG(true)
newImage = .GIF(256, false)

이미지 포맷 중 png는 투명값을 설정할 수도 있고 하지 않을 수도 있다. 이때 bool 타입을 통해 투명한 png인지, 불투명한 png인지 보조값을 설정할 수 있다. 마찬가지로 GIF도 사용된 컬러의 수, 애니메이션 여부를 설정할 수 있다. 

 

이러한 세부적인 요소를 연관값을 이용하여 구분할 수 있으며, 런타임 중 값을 저장해야할 필요가 있을 때 사용할 수 있다. 

프로퍼티 & 메소드

enum은 인스턴스를 생성할 수 없지만, 인스턴스처럼 멤버를 사용할 수 있어서 인스턴스 프로퍼티와  메소드, 그리고 타입 프로퍼티와 메소드를 정의할 수 있다. 

 

enum Week : Int {
    case monday = 1
    case tuesday = 2
    case wednesday = 3
    case thursday = 4
    case friday = 5
    case saturday = 6
    case sunday = 0
    
    var value: String { // computed propery
        return "오늘은 \(self.rawValue)."
    }
    
    func getDescription() -> String { // 인스턴스 메소드
        switch self {
        case .monday:
            "주말이 끝났습니다. 한주의 시작입니다."
        case.tuesday:
            "화요일은 월요일보다 더 힘듭니다."
        case.wednesday:
            "한주의 절반이 지나고 있습니다. 힘내세요."
        case.thursday:
            "오늘만 지나면 불금입니다. 힘내세요"
        case.friday:
            "드디어 불금입니다."
        case.saturday:
            "행복한 토요일입니다."
        case.sunday:
            "아쉬운 주말 마지막 날입니다."
        }
    }
    
    static func getName() -> String { // 타입 메소드
        return "이 enum의 이름은 Week입니다."
    }
}

 

computed property와 인스턴스 메소드, 그리고 static 키워드를 이용하여 타입 메소드를 정의할 수 있다. 

var day = Week.friday

print(day.value) // 오늘은 5.
print(day.getDescription()) // 드디어 불금입니다.
print(Week.getName()) //이 enum의 이름은 Week입니다.