iOS/Swift

[Swift] Enum(μ—΄κ±°ν˜•)에 λŒ€ν•΄μ„œ

κ²½ν‘Έ 2023. 3. 22. 18:30
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”~

 

μ˜€λŠ˜μ€ Enum(μ—΄κ±°ν˜•)에 λŒ€ν•΄μ„œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

 

Enumμ΄λž€?

Enum은 Enumeration(μ—΄κ±°ν˜•)의 μ€„μž„λ§λ‘œ, μ„œλ‘œ μ—°κ΄€λœ κ°’λ“€μ˜ 집합을 μ •μ˜ν•  수 μžˆλŠ” μžλ£Œν˜•μž…λ‹ˆλ‹€.

Swiftμ—μ„œλŠ” μ—΄κ±°ν˜•μ΄ 일반적으둜 Int, String λ“±μ˜ μ›μ‹œκ°’(Raw Value) λ˜λŠ” μ—°κ΄€κ°’(Associated Value)을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성을 높이고, 정확성을 μœ μ§€ν•˜λ©΄μ„œ κ°„κ²°ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

Enum을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 경우

Enum을 μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, μƒνƒœλ₯Ό λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³  이λ₯Ό 쑰건문 등을 톡해 λΉ„κ΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό 생각해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

let stateA = "State A"
let stateB = "State B"
let currentState = stateA

if currentState == stateA {
  print("ν˜„μž¬ μƒνƒœλŠ” Aμž…λ‹ˆλ‹€.")
} else if currentState == stateB {
  print("ν˜„μž¬ μƒνƒœλŠ” Bμž…λ‹ˆλ‹€.")
} else {
  print("μƒνƒœλ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.")
}

 

μ΄λ ‡κ²Œ μƒνƒœλ₯Ό String으둜 μ„ μ–Έν•˜κ³ , 쑰건문으둜 λΉ„κ΅ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λ©΄ μ½”λ“œκ°€ 길어지고 가독성이 λ–¨μ–΄μ§€λŠ” λ“±μ˜ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Enum을 μ‚¬μš©ν•˜λŠ” 경우

Enum을 μ‚¬μš©ν•˜λ©΄, μƒνƒœλ₯Ό Enum으둜 μ •μ˜ν•˜μ—¬ 이λ₯Ό λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 μ½”λ“œλ₯Ό 생각해 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

enum State {
  case A
  case B
}

let currentState: State = .A

switch currentState {
  case .A:
    print("ν˜„μž¬ μƒνƒœλŠ” Aμž…λ‹ˆλ‹€.")
  case .B:
    print("ν˜„μž¬ μƒνƒœλŠ” Bμž…λ‹ˆλ‹€.")
}

 

μ΄λ ‡κ²Œ Enum을 μ‚¬μš©ν•˜λ©΄, λ³€μˆ˜μ˜ 값이 μƒνƒœκ°€ λ©λ‹ˆλ‹€. 그리고 switch 문으둜 λ³€μˆ˜μ˜ 값에 따라 λ‹€λ₯Έ λ™μž‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 가독성이 μ’‹κ³ , μ½”λ“œκ°€ κ°„κ²°ν•΄μ§€λŠ” λ“±μ˜ μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

 

Enum을 ν™œμš©ν•˜λŠ” 방법

Enumμ—μ„œλŠ” rawValue, caseIterable, μ—°κ΄€κ°’ λ“±μ˜ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1. rawValue(μ›μ‹œκ°’)

Enumμ—μ„œλŠ” rawValueλ₯Ό μ‚¬μš©ν•˜μ—¬, Enum의 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. rawValueλŠ” Enumμ—μ„œ 각 case의 κ°’μœΌλ‘œ, μ •μˆ˜ν˜•, λ¬Έμžμ—΄ 등을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 Enumμ—μ„œ rawValueλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

enum State: Int {
  case A = 0
  case B = 1
}

let currentState = State(rawValue: 1)

switch currentState {
  case .A:
    print("ν˜„μž¬ μƒνƒœλŠ” Aμž…λ‹ˆλ‹€.")
  case .B:
    print("ν˜„μž¬ μƒνƒœλŠ” Bμž…λ‹ˆλ‹€.")
  case nil:
    print("μƒνƒœλ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.")
}

enum Color: String {
   case red = "red"
   case blue = "blue"
}

let redColor: Color = .red
print(redColor.rawValue) // "red"

 

2. caseIterable

caseIterable은 Enumμ—μ„œ caseλ₯Ό λͺ¨λ‘ λ‚˜μ—΄ν•  수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.

이λ₯Ό μ‚¬μš©ν•˜λ©΄, λ‹€μŒκ³Ό 같이 λͺ¨λ“  caseλ₯Ό 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

enum State: String, CaseIterable {
  case A = "A"
  case B = "B"
}

for state in State.allCases {
  print(state.rawValue)
}
// "A"
// "B"

 

3. μ—°κ΄€κ°’

Enum의 각 caseμ—λŠ” 연관값을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 연관값을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

enum State {
  case A(value: Int)
  case B(value: String)
}

let currentState = State.A(value: 10)

switch currentState {
  case .A(let value):
    print("ν˜„μž¬ μƒνƒœλŠ” A이며, 값은 \(value)μž…λ‹ˆλ‹€.")
  case .B(let value):
    print("ν˜„μž¬ μƒνƒœλŠ” B이며, 값은 \(value)μž…λ‹ˆλ‹€.")
}

 

4. switchλ₯Ό μ΄μš©ν•˜κΈ°

switch문을 μ΄μš©ν•˜λ©΄ Enum의 λ‹€μ–‘ν•œ κΈ°λŠ₯을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, Enumμ—μ„œμ˜ λͺ¨λ“  caseλ₯Ό 좜λ ₯ν•˜κ±°λ‚˜, 연관값이 μžˆλŠ” case만 좜λ ₯ν•˜λŠ” λ“±μ˜ κΈ°λŠ₯을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•žμ„  μ˜ˆμ‹œλ“€μ—μ„œλ„ μ§€μ†μ μœΌλ‘œ switch ꡬ문을 μ‚¬μš©ν•œ 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

enum State {
  case A(value: Int)
  case B(value: String)
  case C
}

let currentState = State.A(value: 10)

switch currentState {
  case .A(let value):
    print("ν˜„μž¬ μƒνƒœλŠ” A이며, 값은 \(value)μž…λ‹ˆλ‹€.")
  case .B(let value):
    print("ν˜„μž¬ μƒνƒœλŠ” B이며, 값은 \(value)μž…λ‹ˆλ‹€.")
  case .C:
    print("ν˜„μž¬ μƒνƒœλŠ” Cμž…λ‹ˆλ‹€.")
}

for state in State.allCases {
  print(state)
}

for case let .A(value) in State.allCases {
  print("A μƒνƒœμ˜ 값은 \(value)μž…λ‹ˆλ‹€.")
}

 


 

 

μ˜€λŠ˜μ€ μ—¬κΈ°κΉŒμ§€ 정리해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

그럼 이만 πŸ‘‹πŸ» πŸ‘‹πŸ» πŸ‘‹πŸ»

 

λ°˜μ‘ν˜•