์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค. ์ค๋์ enumerations์ ๋ํด์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค. swift ๊ฐ๋ฐ์ ๋จํก๋ฐฉ์์ ๋ง์นจ ์ด๋ค๋ถ์ด enum์ ๋ํด์ ์ค๋ฌด์์ ๋ง์ด ์ฐ์ด๋์ง ์ฌ์ญค๋ดค๋๋ฐ์.. (๋์ด์ค ํ์ด๋ฐ)
์ค๋ฌด์์๋ ๊ต์ฅํ ๋ง์ด ์ฐ์ธ๋ค๊ณ ํฉ๋๋ค. ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ฐ์ด๋์ง๋ ๋ค์๋ค์! ๊ณต๋ถํด๋ณด๋ฉด์ ์ดํด๋ด์ผ๊ฒ ์ง๋ง, ๊ทธ๋ฆฌ๊ณ ๊ฒฝํํด๋ด์ผ๊ฒ ์ง๋ง swift์ enum์ ๋ค๋ฅธ ์ธ์ด์ ๋นํด ๊ฐ๋ ฅํ ์ ์ด ๋ง๋ค๋ณด๋ ์ค๋ฌด์์ ํ์์ ์ด๋ผ๊ณ ํ๋ค์. ์ฌ๋ฌ ์ํ๋ฅผ ๋ํ๋ด์ผํ ๋๋, ๋ญ ๊ฐ๋ ์ฑ๋ถ๋ถ์์๋ ํฐ ์ญํ ์ ํ๋ค๊ณ ํฉ๋๋ค. ์ค๋ฌด๋ฅผ ๊ฒฝํํ๊ธฐ ์ ์ enum์ ๋ํ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋ํด์ ์ ์์๋ณด๊ณ ๊ณต๋ถํด์ผ๊ฒ ๋ค๊ณ ๋๊ผ์ต๋๋ค.ใ ใ (๋ด๋น์ ๊ณ ์์ ์ฐจ์ด๋ enum์ ์ผ๋ง๋ ์์ฐ๋๋ก ๊ฐ๋ฆฐ๋ค๊ณ ๋ ํฉ๋๋ค ํํํํซ)
์ค์ํํธ ์คํฐ๋๋ฅผ ํ๋ฉด์ ์คํฐ๋์๋ถ์ด ์๋ ์์์ ์ฐพ์์ฃผ์์ต๋๋ค. enumeration์ ๊ณต๋ถํ๊ธฐ ์ ์, ํด๋น ์์์ ๋ณด๋ฉด์ ์ ์ค๋ฌด์์ enum์ ์จ์ผํ๋์ง์ ๋ํ ์ด์ ์ enum์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง์ ๋ํ ๊ธฐ๋ฅ์ ๋ํด์ ์์๋ณผ ์ ์์ ๊ฒ์ ๋๋ค.
https://www.youtube.com/watch?v=CdBL7m1AeII
๊ทธ๋ผ ์์ํฉ๋๋ค.
swift document chap.08 enumerations (์ด๊ฑฐํ)
Enumerations
์ด๊ฑฐํ์ ์ฐ๊ด์ฑ์ด ์๋ ๊ฐ๋ค์ ๋ชจ์ ๋์ ๊ฒ์ ๋งํ๋ค. C์ธ์ด์์์ ์ด๊ฑฐํ๊ณผ ๋น์ทํ๊ฒ ์ด๊ฑฐํ ์ ๊ฐ๊ฐ์ ๊ฐ์ Intํ์ ๊ฐ์ ์ค ์ ์๋ค. swift์์์ ์ด๊ฑฐํ์ ์ข ๋ ์ตํต์ฑ์ด ์์ด์ ์ด๊ฑฐ์ ๊ฐ ๊ฒฝ์ฐ์ ๊ฐ์ ๊ผญ ์ ๊ณตํ ํ์๋ ์๋ค. raw value๋ผ๊ณ ์๋ ค์ง ๊ฐ ์ผธ์ด์ค์ ๊ฐ์ String, Character, Int, Float, Double ๋ฑ ์ผ ์ ์๋ค.
Swift์ ์ด๊ฑฐํ์ ์ผ๊ธ๊ฐ์ฒด์ด๋ค. ํด๋์ค์ ๋น์ทํ๊ฒ ํ๋กํผํฐ๋ฅผ ๊ณ์ฐํ๊ณ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ณ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ์์ฑ์๋ฅผ ์ ์ํ ์๋ ์๊ณ ์๋ ๊ตฌํ๋ ๊ธฐ๋ฅ ์ด์์ ๊ฒ์ ์ถ๊ฐํ ์ ์๋๋ก ํ์ฅ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค. ํ๋กํ ์ฝ์ ์ฑํํด์ ํ์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ๋ ์๋ค.
Enumeration Syntax
์ด๊ฑฐํ์ ์ ์ธํ๊ธฐ ์ํด์๋ enum ํค์๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๊ฑฐํ์ ๊ธฐ๋ณธ ํํ๋ ๋ค์๊ณผ ๊ฐ๋ค.
enum SomeEnumeration {
// ์ด๊ฑฐ์ฒด ์ ์๋ ์ฌ๊ธฐ์ ๋
}
์ด๊ฑฐํ์ ์ ์ธํด๋ณด์.
enum CompassPoint {
case north
case south
case east
case west
}
//ํ ์ค๋ก ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn uranus, neptune
}
์ ์ฝ๋์์ ๋ณด์ด๋ north, south, east, west ๊ฐ enumeration case (์ด๊ฑฐ ์ผ์ด์ค) ์ด๋ค. ๋ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด case ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ถ๊ฐํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ north, south, east, west ๊ฐ์ ์์์ ์ผ๋ก 0, 1, 2,,, ๊ณผ ๊ฐ์ง์๋ค. ์ด๊ฑฐ case๋ค์ ๊ทธ ์์ฒด๋ก ๊ฐ์ด๊ณ ๋ช ์์ ์ผ๋ก ์ ์ํ CompassPoint๋ผ๋ ํ์ ์ ๊ฐ์ง๋ค.
๊ฐ๊ฐ์ ์ด๊ฑฐํ์ ์๋ก์ด ํ์ ์ ์ ์ํ๋ค. ์ด๊ฑฐํ์ ๋ง๋ค๊ฒ ๋๋ฉด ํ๋์ ์๋ก์ด ํ์ ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋์ ์ด๊ฑฐํ์ Swift ์ ์ด๋ฆ ๊ท์น์ ๋ฐ๋ผ ์ด๋ฆ์ ๊ผญ ๋๋ฌธ์๋ก ์์ํด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ถ๋ถ ๋ณต์ํ ๋ณด๋ค๋ ๋จ์ํ์ผ๋ก ์ด๋ฆ์ ๋ถ์ฌํ๋ค.
โถ ์ด๊ฑฐํ ํ๋์ case ์ ์ ๊ทผ
์๋ ์ฝ๋์ฒ๋ผ CompassPoint ์ด๊ฑฐํ์ ํ๋์ ๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ธฐํ๋ฅผ ํ ๋๋ directionToHead ํ์ ์ ์๋์ผ๋ก ์ถ๋ก ํ๊ธฐ ๋๋ฌธ์ ํ๋ฒ ์ ์ธ ์ดํ ์ด๊ธฐํ๋ฅผ ํ ๋๋ ์งง์ ์ ๊ตฌ๋ฌธ์ผ๋ก ์ค์ ๊ฐ๋ฅํ๋ค.
//์ ๊ทผํ์ฌ ๋ณ์ ์ ์
var directionToHead = CompassPoint.west
//์ด๊ธฐํ
directionToHead = .east
Matching Enumeration Values With a Switch Statement
์ด๊ฑฐํ์ 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")
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด directionToHead ๋ ์ด๊ฑฐํ ์ผ์ด์ค ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. switch ๊ตฌ๋ฌธ์ ์ผ์ด์ค๊ฐ CompassPoint ์ด๊ฑฐํ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ default ๊ตฌ๋ฌธ์ ์์ฑํ์ง ์์๋ ๋๋ค. ๋ง์ฝ ํ๋๋ฅผ ๋นผ๊ณ ์์ฑํ๋ ค๋ฉด default ๊ตฌ๋ฌธ์ ํ์ํ๋ค.
Iterating over Enumeration Cases
์ด๊ฑฐํ์์๋ ์ฌ์ฉํ ๋ ์ด๊ฑฐํ์ ๋ชจ๋ ์ผ์ด์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ์ง๋ง ๊ธฐ๋ณธ์ ์ธ ์ ๊ณต์ ์๋๊ณ , CaseIterable ์ด๋ผ๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํด์ผ ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
/*--------Array๋ก ๋ฐํ๋๋ allCases--------------*/
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\\(numberOfChoices) beverages available")
// "3 beverages available" ๋ฅผ ์ธ์ํจ
/*--------for-in ๊ตฌ๋ฌธ์ ํตํด ์ ๊ทผํ๊ธฐ--------------*/
for beverage in Beverage.allCases {
print(beverage)
}
// coffee
// tea
// juice
์ ์ฝ๋์์๋ Beverage.allcases ๋ผ๊ณ ์์ฑํ์ฌ Beverage์ ๋ชจ๋ case์ ์ ๊ทผํ ์ ์๋ค. allCases ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ฉด case๋ค์ด Arrayํํ๋ก ๋ฐํ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ฝ๋์์ count ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ๋ Array์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
๋ํ for-in ๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ๋ชจ๋ case์ ์ ๊ทผํ ์๋ ์๋ค.
Associated Values
์ง๊ธ๊น์ง์ ์์๋ ๋ชจ๋ ์ด๊ฑฐํ ์ผ์ด์ค๊ฐ ๋ช ์์ ์ผ๋ก ์ ์๋๋ ๊ฒ์ ๋ํด ์ค๋ช ํ๋ค. ์ด๋ ๊ฒ ์ ์๋ ์ด๊ฑฐํ์ ์์๋ ๋ณ์์ Planet.earth ์ ๊ฐ์ด ์ ์ฅํ๊ณ ๋์ค์ ์ด ๊ฐ์ ํ์ธํ๋ค. ํ์ง๋ง ๊ฐ๋์ ๋ค๋ฅธ ํ์ ์ ๊ฐ๊ณผ ์ด๊ฑฐํ ์ผ์ด์ค ๊ฐ์ ํจ๊ป ์ ์ฅํ๊ณ ์ถ์ ๋๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ด๊ฑฐํ์ ์ผ์ด์ค์ ์ ์ฅ๋๋ ๋ค๋ฅธ ๊ฐ์ Associated values ๋ผ๊ณ ํ๋ค.
์๋ฅผ๋ค์ด ์ฌ๊ณ ๋ฅผ ๊ด๋ฆฌํ๋ ์์คํ ์ด ์๋ก ๋ค๋ฅธ ๋ ๋ฐ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๋ค๊ณ ์๊ฐํด๋ณด์. ์ผ๋ถ ์ ํ์ 1D ๋ฐ์ฝ๋๋ผ์ 0-9๊น์ง์ ์ซ์๋ฅผ ์ฌ์ฉํ๊ณ , ์ด๋ค ์ ํ์ QR ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ 2D ๋ฐ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ต๋ 2953๊ธธ์ด์ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์น๋ค๋ฉด ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ.
์ด์ ๊ฐ์ด ๋๊ฐ์ง ํ์ ์ ํ๊ฐ์ง ์ผ์ด์ค์ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ ์ํ ์ ์๋ค.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
์ด์ฒ๋ผ upc ๋ฐ์ฝ๋ ์ผ์ด์ค๋ Int ํ์ ์ 4๊ฐ ๊ฐ์ง ํํ ํํ๋ก, Qrcode ์ผ์ด์ค๋ stringํ์ ์ผ๋ก ์ผ์ด์ค๋ฅผ ๋๋ ์ค ์ ์๋ค. ์ด๋ ๊ฒ ์ด๊ฑฐํ์ ๋ง๋ค์ด์ค ๋ค ์๋์ฒ๋ผ ๊ฐ์ ํ ๋นํด์ค ์ ์๋ค.
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
/*----- ์ด๊ธฐํ -------*/
productBarcode = .qrCode( "ABCDEFGHIJKLMNOP")
๊ทธ๋ฆฌ๊ณ ์๋ ์ฝ๋์ ๊ฐ์ด switch ๊ตฌ๋ฌธ๊ณผ ํจ๊ป ์ฌ์ฉํด์ ํด๋น ๊ฐ์ ์๋ ๊ฐ์ ์ถ์ถํ ์ ์๋ค. ๋ ์ด๋ฐ ์ฌ๋ฌ ๊ฐ๋ค์ด ๋ชจ์ฌ์๋ Associated Value ๋ฅผ ์ํด ๊ฐ๋ค๋ง๋ค ๋ณ์ ํน์ ์์๋ก ์ ํด ์ด๋ฆ์ ๋ถ์ฌ ์ฌ์ฉํ ์๋ ์๋ค.
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." ๋ฅผ ์ธ์ํจ
/*------ let ์ ํ๋๋ง ๋ ์ ์๋ค. ------*/
/*------ ์์ ๋์ผํ ์ฝ๋ ๋ด์ฉ ์ ------*/
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
Associated values ์ ์ด๊ฑฐํ ํ์ ์ด ์ฌ๋ฌ ํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฐ์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ด์๋ค๋ฉด, Raw Values๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฏธ๋ฆฌ ์ ์ธํด ๋ ์ ์๋ ํ์ ์ด๋ค.
enum ASCIIControlCharacter: Character {
case tab = "\\t"
case lineFeed = "\\n"
case carriageReturn = "\\r"
}
์ ์ฝ๋์์๋ ASCIIControlCharacter ๋ผ๋ ์ด๊ฑฐํ์ Raw ๊ฐ์ Character ๊ฐ์ผ๋ก ์ ์ํ๋ค. ์ด ์ธ์๋ Raw Values๋ Int, Float, Double, String ํ์ ์ด ๋ ์ ์๋ค. ํ์ง๋ง ๊ฐ๊ฐ์ ์ผ์ด์ค ๋ง๋ค Raw Value๋ ๊ณ ์ ํ ๊ฐ์ด์ด์ผ ํ๋ค.
Associated Values์์ ์ฐจ์ด์
Raw value ๋ ์ด๊ฑฐํ์ ์ฒ์ ์ ์ํ ๋ ๋ฏธ๋ฆฌ ์ฑ์์ง ๊ฐ์ผ๋ก ๊ฐ์ ์ค์ ํ๋ ๊ฒ
Associated value๋ ํ์ ๋ง ์ ํด์ฃผ๊ณ ๋์ค์ ๊ฐ์ ์ฑ์ฐ๋ ๊ฒ
์ฆ, Raw value๋ ์๋ก์ด ์ธ์คํด์ค๊ฐ ๋ชจ๋ ๊ฐ์๊ฐ์ ๊ฐ์ง์ง๋ง, Associated value๋ ๋ณํ ์ ์๋ค.
Implicitly Assigned Raw Values (์์์ ์ผ๋ก ํ ๋นํ๋ raw value)
์ ์๋ ๋ฌธ์์ด ์์ ๊ฐ์ ์ ์ฅํ ์ด๊ฑฐํ์ ์์ ํ ๋๋, ๊ฐ case ์ ์์ ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ ๋นํ์ง ์์๋ ๋๋ค. ๋ฌผ๋ก ์ ์ธํ๋ฉด ๊ทธ ๊ฐ์ด ํด๋น case์ Raw Value๊ฐ ๋๊ฒ ์ง๋ง, ์ ์ธํ์ง ์์ผ๋ฉด Swift๊ฐ ์์์ ๊ฐ์ ํ ๋นํ๊ฒ ๋๋ค.
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3
์ ์ฝ๋์์๋ Planet.mercury ๋ 1 ์ด๋ผ๋ ๋ช ์์ ์ธ ๊ฐ์ ๊ฐ๋๋ค. ํ์ง๋ง ๊ทธ ์ดํ๋ ์์ฑํ์ง ์์๋๋ฐ, ์์์ Swfit๊ฐ 2, 3, 4, 5, ... ๊ฐ์ ํ ๋นํด์ค๋ค.
์์๊ฐ์ผ๋ก ๋ฌธ์์ด์ ์ฌ์ฉํ ๋๋, ๊ทธ case ์ด๋ฆ์ ์๋ ๋ฌธ์ฅ์ด ๊ฐ case ์ ์์์ ์ธ ๊ฐ์ด๋ค. ์๋ ์ด๊ฑฐํ ์์๋ฅผ ๋ณด์.
enum CompassPoint: String {
case north, south, east, west
}
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
์ ์ฝ๋์ฒ๋ผ ์๋ฌด๊ฒ๋ ์ ์ธํด์ฃผ์ง ์์ผ๋ฉด Case์ ์ด๋ฆ์ด String ํ์ ์ผ๋ก Raw Value ๊ฐ ๋๋ค.
Initializing from a Raw Value
์ด๊ฑฐํ์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ๋ณ์๋ ์์์ rawValue๋ผ๋ ๋งค๊ฐ๋ณ์๋ก ์ด๊ธฐํํ ์ ์๋๋ฐ ์ด๋ ๊ฒ ๋๋ฉด ๋ฐํ๊ฐ์ผ๋ก ํด๋น Raw Value๊ฐ ์กด์ฌํ๋ฉด ํด๋น case์ ๊ฐ์ด ๋์ค๊ณ , ์กด์ฌํ์ง ์๋ Raw Value๋ผ๋ฉด nil ์ด ๋ฐํ๋๋ค. ์ฆ, ์ต์ ๋ ํ์ ์ผ๋ก ๋ฐํ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet ์ Planet? ํ์
์ด๊ณ Planet.uranus ์ ๊ฐ์
์์ ๊ฐ์ด ๊ฐ์ด ์๋ค๋ฉด ๋คํ์ด์ง๋ง, ์๋ ๊ฒฝ์ฐ nil ์ด ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ์คํจํ ์๋ ์๋ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ด๋ค. (๊ฐ์ด ์๋ค๋ฉด ์๋ฌ) ๋ฐ๋ผ์ if let ๊ตฌ๋ฌธ์ ์ด์ฉํ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ ์์ ํ๊ฒ ์ถ์ถํด์ผํ๋ค.
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" ๋ฅผ ์ธ์ํจ
์ ์ฝ๋์์ 11๋จผ์งธ ํ์ฑ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ฉด Raw Value ๋ ์๊ธฐ ๋๋ฌธ์ if let ๊ตฌ๋ฌธ์์ else ๋ถ๋ถ์ด ์ํ๋์๋ค. (nil์ ๋ฐํํ ๊ฒ์ด๋ค)
Recursive Enumerations
์ฌ๊ท ์ด๊ฑฐํ์ ์ด๋ค ์ด๊ฑฐํ์ ์ผ์ด์ค์ Associated Value์ ํ์ ์ผ๋ก ์์ ์ ์ด๊ฑฐํ ํ์ ์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ด๋ ๊ฒ ์์ ์ ์ด๊ฑฐํ ํ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋น ์ผ์ด์ค ์์ indirect๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
์์ฝ๋์ฒ๋ผ ์ฌ๋ฌ๋ฒ ์ฐ๊ธฐ ๊ท์ฐฎ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ ์ผ ์ฒ์์ ํ ๋ฒ๋ง ์จ์ค๋ ๋๋ค.
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
์ ์์ ์์๋ addition, multiplication ์ผ์ด์ค์์ recursive enumeration์ด ์ฌ์ฉ๋๊ณ , ํด๋น ์ผ์ด์ค์์๋ associated valueํ์ ์ผ๋ก ์์ ์ ์ด๊ฑฐํ ํ์ ์ ๊ฐ์ง๊ณ ์๋ค.
์๋ ์ฝ๋๋ (5 + 4) * 2 ๋ฅผ ์์ฑํ๊ณ ์๋ ์ฌ๊ท์ด๊ฑฐํ์ธ ArithmeticExpression ์ ์์ฑํด ๋ณด์๋ค. ์ฌ๊ท ์ด๊ฑฐํ์ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
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" ๋ฅผ ์ธ์ํจ