스위프트 투어 - 열거형과 구조체 Swift


열거형과 구조체

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()

덧글

댓글 입력 영역