관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] enum 생성자, 초기화 사용하는 방법 (패턴 매칭, Pattern Matching) 본문

iOS 응용 (swift)

[iOS - Swift] enum 생성자, 초기화 사용하는 방법 (패턴 매칭, Pattern Matching)

jake-kim 2022. 10. 9. 21:25

Enum 생성자 사용

  • enum도 class와 struct와 같이 초기화하여 사용할 수 있도록 하는 방법이 존재

ex) 과일 이름 문자열 값을 enum타입의 생성자로 넣으면, 과일 타입으로 나오게끔 하는 방법

let fruit = "apple"
let type = Fruit(fruit)
print(type) // Optional(Fruit.apple)

enum 생성자 사용 방법

  • enum 준비
enum Fruit {
  case apple
  case banana
  case orange
}
  • switch문을 통하여 case타입을 초기화 하는 방식이기에, 내부적으로 초기화할때 사용할 각 타입에 따른 이름 값 정의
  private var nameValue: String {
    switch self {
    case .apple:
      return "apple"
    case .banana:
      return "banana"
    case .orange:
      return "orange"
    }
  }
  • 초기화에 사용할 init 구문과, switch문을 사용하려면 Pattern Matching 방법을 사용하기 때문에, ~= 연산자를 정의
  init?(_ name: String) {
    switch name {
    case .apple:
      self = .apple
    case .banana:
      self = .banana
    case .orange:
      self = .orange
    default:
      return nil
    }
  }
  
  static func ~=(lhs: Self, rhs: String) -> Bool {
    return lhs.nameValue == rhs
  }

완성)

let fruit = "banana"
let type = Fruit(fruit)
print(type) // Optional(Fruit.banana)

위 패턴을 사용하는 경우

  • 앱 딥링크 처리를할때 문자열 url을 파싱해서 어떤 딥링크인지 판단할때 위 방법을 사용
    • 문자열을 받아서 특정 타입으로 초기화
  • 사용자가 핸드폰 번호, 패스워드, 이름 정보등 문자열을 입력했을때 핸드폰 번호인지, 패스워드인지, 이름 정보인지 타입을 구분할때도 사용 

* 전체 코드: https://github.com/JK0369/ExEnum

Comments