열거형과 구조체
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
기본적으로 스위프트는 0으로 시작하는 로값을 할당하고 매번 증가시키지만, 특정 값을 명시적으로 할당해 이를 바꿀 수 있다. 위의 예시에서 ace는 명시적으로 1ㅇ르 할당했는데 나머지 로값은 순서대로 할당된다. 스트링들이나 부동소수점값들을 열거형의 로형식으로 사용할 수 있다. rawValue 속성을 사용해 열거의 로값에 접근할 수 있다.
init?(rawValue:) 생성자를 사용해 로우 값으로부터의 열거형 인스턴스를 만들 수 있다. 로값과 일치하는 열거형 값이되거나 매칭되는게 없으면 nil이 된다.
if (let convertedRank = Rank(rawValue: 3)) {
let threeDescription = convertedRank.simpleDescription()
}
열거형의 케이스 값들은 실제 값으로서 이들 로값을 작성하는 다른 방법만이 아니다. 실제로, 의미있는 로값이 없을 때 반드시 제공할필요는 없다.
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
let heartsDescription = hearts.simpleDescription()
열거형의 hearts케이스는 두가지 방법으로 참조했음을 확인한다. hearts 상수에 값을 할당할 때 Suit.hearts로서 풀네임으로 참조했는데 상수가 명시적 지정 형식이 없기 때문이다. 스위치 내에서 열거형 케이스는 함축 폼인 .hearts 로 참조되는데 self의 값이 이미 알려졌기 때문이다. 값의 형식이 이미 알려진 경우 압축 폼을 사용할 수 있다.
만약 열거형이 로값을 가지면 이들 값은 정의의 일부로 측정될 수 있고 특정 열거 형의 모든 인스턴스가 같은 로값을 가짐을 의미한다. 열거 케이스를 위한 다른 선택은 케이스와 연계된 값을 가지는것으로 이들 값은 인스턴스를 만들때 측정되고 열거케이스의 각 인스턴스를 위해서는 다를 수 있다. 열거형식 인스턴스의 저장된 프로퍼티와 같은 값들을 생각할 수 있다. 예를 들어, 서버로부터 선라이즈와 선셋 시간을 요청하는상황을 생각할 수 있다. 서버는 요청된 정보에 반응하거나 잘못된 것으로 정의에 반응한다.
enum ServerResponse {
case result(String, String)
case failure(String)
}
let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
switch success {
case let .result(sunrise, sunset):
print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
print("Failure... \(message)")
}
어떻게 선라이즈와 선셋시간이 ServerResponse 값으로 부터 얻어지는지 확인한다. 스위치 케이스대신 값을 매칭하여 이뤄진다.
struct 를 사용해 구조체를 생성한다. 구조체는 클래스와 거의 비슷한 작용을한다. 가장 중요한 차이는 항상 카피된다는 점이다. 즉, 구조체는 값에의한 전달. 클래스는 참조에의한 전달
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank:.three, suit:.spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()




최근 덧글