목차
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"