Swift 곡μ λ¬Έμ μ 리 - μ΄κ±°ν (Enumerations)
μλ νμΈμ. μ΄λ²μλ μ΄κ±°ν(Enumeration)μ λν΄ μμλ³΄κ² μ΅λλ€.
π μ΄κ±°νμ΄λ?
**μ΄κ±°ν(Enumeration)**μ κ΄λ ¨λ κ°λ€μ κ·Έλ£Ήμ μν μ¬μ©μ μ μ νμ μΌλ‘, μ½λμμ νμ -μΈμ΄ν λ°©μμΌλ‘ μμ ν μ μκ² ν΄μ€λλ€.
νμ -μΈμ΄ν: μ»΄νμΌλ¬κ° μ½λμ νμ μμ μ±μ κ²μ¬νμ¬ νμ λΆμΌμΉλ‘ μΈν μ€λ₯λ₯Ό λ°©μ§νλ νΉμ±
CμΈμ΄μ μ΄κ±°νμ΄ λ¨μν μ μκ°μ μ΄λ¦μ λΆμ¬νλ κ²κ³Ό λ¬λ¦¬, Swiftμ μ΄κ±°νμ:
- μ μκ°μ κ°μ§ νμκ° μμ
- λ¬Έμμ΄, λ¬Έμ, μ μ, λΆλμμμ λ± λ€μν νμ μ μμκ° μ¬μ© κ°λ₯
- μ°κ΄κ°(associated values)μ ν΅ν΄ κ° μΌμ΄μ€μ μΆκ° μ 보 μ μ₯ κ°λ₯
- λ©μλμ κ³μ°λ νλ‘νΌν°λ₯Ό κ°μ§ μ μμ
- μ΄κΈ°ν ꡬ문과 νμ₯ κΈ°λ₯ μ 곡
- νλ‘ν μ½ μ€μ κ°λ₯
π μ΄κ±°ν κΈ°λ³Έ ꡬ문
// κΈ°λ³Έ μ΄κ±°ν μ μ
enum CompassPoint {
case north
case south
case east
case west
}
// ν μ€λ‘ μμ±νλ λ°©λ²
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
enum: μ΄κ±°νμ μ μνλ ν€μλ
case: μ΄κ±°νμ κ° μΌμ΄μ€(κ°)λ₯Ό μ μνλ ν€μλ
μ΄κ±°ν κ° μ¬μ©νκΈ°
var directionToHead = CompassPoint.west
// νμ
μ΄ μ΄λ―Έ μλ €μ§ κ²½μ° λ μ§§μ μ ꡬ문 μ¬μ© κ°λ₯
directionToHead = .east
π switch λ¬ΈμΌλ‘ μ΄κ±°ν κ° λ§€μΉνκΈ°
μ΄κ±°νμ switch λ¬Έκ³Ό ν¨κ» μ¬μ©νλ©΄ λ§€μ° κ°λ ₯ν©λλ€:
directionToHead = .south
switch directionToHead {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
// "Watch out for penguins" μΆλ ₯
μ€μ: Swiftμ switch λ¬Έμ μ΄κ±°ν μΌμ΄μ€λ₯Ό μ²λ¦¬ν λ μμ ν΄μΌ ν©λλ€. λͺ¨λ μΌμ΄μ€λ₯Ό λ€λ£¨μ§ μμΌλ©΄ μ»΄νμΌ μ€λ₯κ° λ°μν©λλ€. λͺ¨λ μΌμ΄μ€λ₯Ό κ°κ° μ²λ¦¬νκ³ μΆμ§ μμ κ²½μ° default μΌμ΄μ€λ₯Ό μ¬μ©ν μ μμ΅λλ€.
π μ΄κ±°ν μΌμ΄μ€ λ°λ³΅νκΈ°
CaseIterable νλ‘ν μ½μ μ¬μ©νλ©΄ μ΄κ±°νμ λͺ¨λ μΌμ΄μ€λ₯Ό μμ§ν μ μμ΅λλ€:
enum Beverage: CaseIterable {
case coffee, tea, juice
}
// μΌμ΄μ€ μ μ»κΈ°
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// "3 beverages available" μΆλ ₯
// λͺ¨λ μΌμ΄μ€ λ°λ³΅νκΈ°
for beverage in Beverage.allCases {
print(beverage)
}
// coffee, tea, juice μΆλ ₯
CaseIterable: μ΄κ±°νμ λͺ¨λ μΌμ΄μ€μ 컬λ μ μ μ 곡νλ νλ‘ν μ½
π μ°κ΄ κ°(Associated Values)
μ΄κ±°νμ κ° μΌμ΄μ€μ λ€λ₯Έ νμ μ μΆκ° μ 보λ₯Ό μ μ₯ν μ μμ΅λλ€:
enum Barcode {
case upc(Int, Int, Int, Int) // UPC λ°μ½λ: μ«μ μμ€ν
, μ μ‘°μ
체 μ½λ, μ ν μ½λ, κ²μ¬ μ«μ
case qrCode(String) // QR μ½λ: λ¬Έμμ΄ λ°μ΄ν°
}
// μ°κ΄ κ°μ κ°μ§ μ΄κ±°ν μ¬μ©νκΈ°
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
μ°κ΄ κ°: μ΄κ±°ν μΌμ΄μ€μ ν¨κ» μ μ₯λλ μΆκ° μ 보λ‘, μΌμ΄μ€κ° μ¬μ©λ λλ§λ€ λ€λ₯Έ κ°μ κ°μ§ μ μμ΅λλ€.
switch λ¬ΈμΌλ‘ μ°κ΄ κ° μΆμΆνκΈ°
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let productCode):
print("QR code: \(productCode)")
}
// "QR code: ABCDEFGHIJKLMNOP" μΆλ ₯
// λ κ°κ²°ν λ°©λ²
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case let .qrCode(productCode):
print("QR code: \(productCode)")
}
π μμ κ°(Raw Values)
μ΄κ±°νμ κ° μΌμ΄μ€μ λμΌν νμ μ κΈ°λ³Έκ°μ μ§μ ν μ μμ΅λλ€:
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
μμ κ°: μ΄κ±°νμ μ μν λ κ° μΌμ΄μ€μ 미리 μ€μ νλ κ°μΌλ‘, λͺ¨λ μΌμ΄μ€μμ λμΌν νμ μ κ°μ§λλ€.
μμμ μΌλ‘ ν λΉλ μμ κ°
μ μλ λ¬Έμμ΄ μμ κ°μ κ°μ§ μ΄κ±°νμ λͺ μμ μΈ κ°μ μ§μ νμ§ μμΌλ©΄ μλμΌλ‘ κ°μ΄ ν λΉλ©λλ€:
// μ μ μμ κ°μ κ²½μ°: μ΄μ μΌμ΄μ€λ³΄λ€ 1 μ¦κ°
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
// venusλ 2, earthλ 3, ...
// λ¬Έμμ΄ μμ κ°μ κ²½μ°: μΌμ΄μ€ μ΄λ¦κ³Ό κ°μ λ¬Έμμ΄
enum CompassPoint: String {
case north, south, east, west
}
// northλ "north", southλ "south", ...
μμ κ° μ κ·ΌνκΈ°
let earthsOrder = Planet.earth.rawValue // 3
let sunsetDirection = CompassPoint.west.rawValue // "west"
μμ κ°μΌλ‘ μ΄κΈ°ννκΈ°
// μμ κ°μΌλ‘λΆν° μ΄κ±°ν μΌμ΄μ€ μμ± (μ΅μ
λ λ°ν)
let possiblePlanet = Planet(rawValue: 7) // uranus
// μ‘΄μ¬νμ§ μλ μμ κ°μΌλ‘ μ΄κΈ°ν
let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
} else {
print("There isn't a planet at position \(positionToFind)")
}
// "There isn't a planet at position 11" μΆλ ₯
μ€μ: μμ κ°μΌλ‘ μ΄κΈ°ννλ κ²μ μ€ν¨ν μ μμΌλ―λ‘ νμ μ΅μ λ μ΄κ±°ν μΌμ΄μ€λ₯Ό λ°νν©λλ€.
π μ¬κ· μ΄κ±°ν(Recursive Enumerations)
μμ μ λ€λ₯Έ μΈμ€ν΄μ€λ₯Ό μ°κ΄ κ°μΌλ‘ κ°μ§λ μ΄κ±°νμ μ μν μ μμ΅λλ€:
// indirect ν€μλλ‘ μ¬κ·μ μΌμ΄μ€ νμ
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
// λλ μ 체 μ΄κ±°νμ indirectλ‘ νμ
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
indirect: μ¬κ·μ λ°μ΄ν° ꡬ쑰λ₯Ό λ§λ€κΈ° μν΄ μ»΄νμΌλ¬μκ² νμν κ°μ κ³μΈ΅μ μ½μ νλλ‘ μ§μνλ ν€μλ
μ¬κ· μ΄κ±°ν μ¬μ© μμ
// (5 + 4) * 2 ννμ λ§λ€κΈ°
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
// μ¬κ· ν¨μλ‘ μμ κ³μ°νκΈ°
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product)) // 18 μΆλ ₯ ((5 + 4) * 2)
Swiftμ μ΄κ±°νμ λ¨μν κ° λͺ©λ‘ μ΄μμ κΈ°λ₯μ μ 곡ν©λλ€. μ°κ΄ κ°κ³Ό μμ κ°, μ¬κ· ꡬ쑰, νλ‘ν μ½ μ€μ λ±μ κΈ°λ₯μ ν΅ν΄ 볡μ‘ν λ°μ΄ν° λͺ¨λΈμ κ°κ²°νκ³ νμ μμ νκ² ννν μ μμ΅λλ€.