목차

6. Enumerations and Structures

1. enum

열거형enumeration을 만들기 위해서 enum을 사용한다. 클래스와 다른 이름이 붙여진 타입들과 같이, 열거체들은 그들과 함께 메소드를 만들 수 있다.

enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king

    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.ace
let aceRawValue = ace.rawValue

swift에서의 self는 인스턴스의 특별한 속성property이다. 그 스스로의 인스턴스를 잡아놓는. 대부분의 self생성자initializer 혹은 클래스의 메소드, 구조체 혹은 열거형에서 나타난다.

experiment

두개의 Rank 값의 rawValue를 비교하는 함수를 작성하라.

func compareRank(valA: Rank, valB: Rank) -> Bool {
    return valA.rawValue == valB.rawValue
}

compareRank(valA: Rank.ace, valB: Rank.queen)  //  false
compareRank(valA: Rank.two, valB: Rank.two)  //  true

기본적으로 스위프트는 raw 값에 0에서 시작해 1씩 증가하도록 할당하고 있다. 그러나 이는 값을 명시적으로 지정하는 것을 통해 바꿀 수 있다. 위의 예시에서, ace는 명시적으로 1이라는 raw값을 받았고, 남은 raw 값들은 그 다음 순서대로 할당받는다. 그리고 String이나 열거체의 raw 타입으로써의 floating-point number도 사용 가능하다floating-point numbers as the raw type of an enumeration. rawValue 속성을 이용해 열거체 케이스의 raw 값에 접근할 수 있다.

init?(rawValue:)

raw 값으로부터 열거체의 인스턴스를 만들기 위해 init?(rawValue:) 생성자를 사용한다. init?(rawValue:)는 열거체 케이스에 매치되는 raw 값을 반환하거나, 만약 매칭되는 Rank가 없으면 nil을 반환한다.

if let convertedRank = Rank(rawValue: 3) {  // rawValue가 3인 값을 매칭 => "three"
	//  return String(self.rawValue) => convertedRank.rawValue => "3" (: String)
	let threeDescription = convertedRank.simpleDescription()
}

⚠️ Initialization of immutable value 'threeDescription' was never used; consider replacing with assignment to '_' or removing it.

//위의 코드를 수정한 것 (threeDescrption을 사용하지 않아서)
if let convertedRank = Rank(rawValue: 3) {
		_ = convertedRank.simpleDescripton()
}

열거체의 케이스 값들은 진짜actual 값들이며, 단지 그들의 다른 표현법이 아니다. 실제로, 케이스 내에서 의미 있는 raw값이 아니라면 제공할 필요가 없다.

enum ***Suit*** {  //  열거체
    case spades, hearts, diamonds, clubs

    func simpleDescription() -> String {
        switch self {
            case .spades:
                return "spades"
            case .hearts:
                return "hearts"
            case .diamonds:
                return "diamonds"
            case .clubs:
                return "clubs"
         }
    }
}
let hearts = Suit.hearts  //hearts
let heartsDescription = hearts.simpleDescription()  //  "hearts"