1. ์ด๊ฑฐํ ๋ฌธ๋ฒ
2. switch๋ฌธ๊ณผ ์ฌ์ฉํ๊ธฐ
3. ์ด๊ฑฐํ์ ์ผ์ด์ค๋ค์ ๋ฐ๋ณตํ๊ณ ์ถ์ ๋(CaseIterable ํ๋กํ ์ฝ)
4. ์ฐ๊ด๊ฐ(Associated Values)4-1. if, switch, guard, for, while๋ฌธ๊ณผ ์ฐ๊ด๊ฐ ๋งค์นญ to be continued,,
5. ์์๊ฐ(Raw Values)
5-1. ์์์ ์ผ๋ก ํ ๋น๋ ์์๊ฐ(Implicitly Assigned Raw Values)
5-2. ์์๊ฐ์ผ๋ก ์ด๊ธฐํ(Initializing from a Raw Value)
6. ์ฌ๊ท ์ด๊ฑฐํ(Recursive Enumerations)
7. ์ด๊ฑฐํ์ ์ผ์ด์ค๋ค์ ๋น๊ตํ๊ณ ์ถ์ ๋(Comparable ํ๋กํ ์ฝ)
8. ๋ฉ์๋
์ด๊ฑฐํ(enumeration)์ ๊ด๋ จ๋ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ทธ๋ฃน์ ํ๋์ ์ผ๋ฐ์ ์ธ ํ์ ์ผ๋ก ์ ์ํด์ ์ฝ๋์ ํ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
swift์ ์ด๊ฑฐํ์ ํด๋ก์ ์ฒ๋ผ 1๊ธ ๊ฐ์ฒด์ด๋ค.
1. ๊ณ์ฐ ํ๋กํผํฐ(computed property)๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด๊ฑฐํ์ ํ์ฌ ๊ฐ์ ๋ํ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ์๋จ์ผ๋ก ์ฌ์ฉ๋๋ค.
2. ์ธ์คํด์ค ๋ฉ์๋(instance method)๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด๊ฑฐํ์ด ๋ํ๋ด๋ ๊ฐ์ ๊ด๋ จ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
3. ์์ฑ์(initializer)๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๊ฑฐํ ์ผ์ด์ค์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
4. ๊ธฐ์กด ๊ตฌํ์์ ํ์ฅ(extension)์ ํ ์ ์๋ค.
5. ํ๋กํ ์ฝ(protocol)์ ์ฑํํ ์ ์๋ค.
6. ์ ์ฅ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ด๊ฑฐํ์ ๊ฐ ํ์ ์ด๋ผ๋ ์ ์์ ์ฐธ์กฐ ํ์ ์ธ ํด๋์ค์ ๋ค๋ฅด๋ค.
1. ์ด๊ฑฐํ ๋ฌธ๋ฒ
์ด๊ฑฐํ์ ํด๋์ค์ ๊ตฌ์กฐ์ฒด์ฒ๋ผ enum
ํค์๋๋ฅผ ํตํด ์ ์ธํ๊ณ , ํ์ํ ๋งํผ ์ผ์ด์ค๋ค์ ๋์ดํ๋ฉด ๋๋ค. ๊ฐ ์ผ์ด์ค๋ ๊ทธ ์์ฒด๊ฐ ๊ณ ์ ํ ๊ฐ์ด ๋๋ค.
enum SomeEnumeration {
case CaseName1
case CaseName2
}
enum CompassPoint {
case north
case south
case east
case west
}
north
,south
,east
,west
๋ค์ ์ด๊ฑฐํ์ ์ผ์ด์ค(cases)๋ค๋ก,case
ํค์๋๋ฅผ ์ฌ์ฉํด ์ ์๋์๋ค.
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
- ์ฌ๋ฌ ๊ฐ์ ์ผ์ด์ค๋ค์ ์ฝค๋ง๋ก ๊ตฌ๋ถํ์ฌ ํ ์ค๋ก ์ธ ์ ์๋ค.
var directionToHead = CompassPoint.west
directionToHead = .east // ํ์
์๋ต
- ์ด๊ฑฐํ๋ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํ์ ์ฒ๋ผ UpperCamelCase๋ก ๋๋ฌธ์๋ก ์์ํ๋ ๋จ์ํ ์ด๋ฆ์ผ๋ก ๋ค์ด๋ฐํ๋ค. ๊ฐ ์ผ์ด์ค๋ค์ lowerCamelCase๋ฅผ ๋ฐ๋ฅด๊ธฐ์ ์๋ฌธ์๋ก ์์ํ๋ค.
- ๋ํ ์ด๊ฑฐํ์ ํธ์ถํ ์ดํ์ ๊ฐ์ด ํ์ ์ถ๋ก ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ํ์ ๋ช ์ ์๋ตํ ์๋ ์๋ค.
2. switch๋ฌธ๊ณผ ์ฌ์ฉํ๊ธฐ
enum์ 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")
}
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
- switch๋ฌธ์ ๋ฐ๋์ ์ด๊ฑฐํ์ ๋ชจ๋ case๋ค์ ์์ ํ ํฌํจํด์ผ ํ๋ค. ์ปดํ์ผ๋ฌ๋ ์ด๊ฑฐํ์ ์ผ์ด์ค๋ค์ด ํ์ ๋์ด ์๋ค๊ณ ์ธ์งํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ case๋ค์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ๋ค๋ฉด default๋ฅผ ์ฐ์ง ์์๋ ๋๋ค.
- ๋ง์ฝ case ํ๋๋ผ๋ ์๋ตํ๋ฉด default๋ฅผ ๊ผฌ์ฅ ์จ์ผ ํ๋ค.
3. ์ด๊ฑฐํ์ ์ผ์ด์ค๋ค์ ๋ฐ๋ณตํ๊ณ ์ถ์ ๋
์ด๊ฑฐํ์ ๋ชจ๋ ์ผ์ด์ค๋ค์ ์ํํ๊ณ ์ถ์ ๋, CaseIterable
ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด allCases
๋ผ๋ ํ์
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด ํ๋กํผํฐ๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ์ฝ๋ ์
์ฒ๋ผ ์ทจ๊ธ๋๋ฉฐ, ์ผ์ด์ค๋ค์ ๊ฐ์(.count
), for๋ฌธ์ ํตํ ์ํ ๋ฑ์ ํ ์ ์๋ค.
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count // 3
for beverage in Beverage.allCases {
print(beverage)
}
// coffee
// tea
// juice
But,, CaseIterable
ํ๋กํ ์ฝ์ ์ฑํํ๋ค๊ณ ๋ค allCases
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋๋ค. ์ด๊ฑฐํ์ ์ผ์ด์ค๊ฐ ์ฐ๊ด๊ฐ์ ๊ฐ์ง๊ฑฐ๋, ํน์ ์ผ์ด์ค๊ฐ @available
ํค์๋๋ฅผ ํตํด ํน์ ํ๋ซํผ์์ ์ฌ์ฉ ์กฐ๊ฑด์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ ์ง์ allCases
ํ๋กํผํฐ๋ฅผ ๊ตฌํํด์ค์ผ ํ๋ค.
4. ์ฐ๊ด๊ฐ(Associated Values)
ํน์ ์ผ์ด์ค์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํจ. ์ฐ๊ด๊ฐ์ ์ด๋ค ์๋ฃํ์ด๋ ๊ฐ๋ฅํ๊ณ , ๊ฐ์์ ์ ํ๋ ์๊ณ , ์ผ์ด์ค ๋ณ๋ก ๋ค๋ฅธ ์๋ฃํ์ ์ฐ๊ด๊ฐ์ ๊ฐ์ง ์ ์๋ค.
์ฐธ๊ณ ๋ก, ํ์ ํ ์์๊ฐ๊ณผ ์ฐ๊ด๊ฐ์ ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ํ๋ค!
// 1๏ธโฃ
enum Code {
case barCode(Int, Int, Int, Int)
case qrCode(name: String)
case codeBlue
}
// 2๏ธโฃ
var productBarcode = Code.barCode(8, 85909, 51226, 3)
productBarcode = .qrCode(name: "ABCDEFG")
// 3๏ธโฃ
switch productBarcode {
case .barCode(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(var productCode):
print("QR code: \(productCode).")
case .codeBlue:
print("์ฝ๋ ๋ธ๋ฃจ")
}
// 4๏ธโฃ
switch productBarcode {
case let .barCode(numberSystem, manufacturer, product, check):
print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case var .qrCode(productCode):
print("QR code: \(productCode).")
case .codeBlue:
print("์ฝ๋ ๋ธ๋ฃจ")
}
- 1๏ธโฃ
- ์ผ์ด์ค ์ด๋ฆ ์์ ํํ ํํ๋ก ์ผ์ด์ค์ ์ฐ๊ด๊ฐ์ผ๋ก ์ํ๋ ์๋ฃํ์ ํํ ํํ๋ก ๋ช
์ํ๋ฉด ๋๋ค.
- ์์ ๋ ์ด๋ธ์ ๋ถ์ด๋ ๋ค์๋ ํํ๋ ๊ฐ๋ฅํ๋ค!
- ๋ค๋ฅธ ์ผ์ด์ค๋ค์ด ์ฐ๊ด๊ฐ์ ๊ฐ๋๋ค๊ณ ๋ชจ๋ ์ผ์ด์ค๋ค์ด ์ฐ๊ด๊ฐ์ ๊ฐ์ง ํ์๋ ์๋ค.
- ์ผ์ด์ค ์ด๋ฆ ์์ ํํ ํํ๋ก ์ผ์ด์ค์ ์ฐ๊ด๊ฐ์ผ๋ก ์ํ๋ ์๋ฃํ์ ํํ ํํ๋ก ๋ช
์ํ๋ฉด ๋๋ค.
- 2๏ธโฃ
- ์ด๊ฑฐํ์ ์์ฑ/์ด๊ธฐํํ ๋ ์ฐ๊ด๊ฐ์ ๊ฐ์ ํจ๊ป ์ ๋ฌํด์ค๋ค.
- 3๏ธโฃ, 4๏ธโฃ
- ์ด๊ฑฐํ์ ์ฐ๊ด๊ฐ๊ณผ switch๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ถ์ถํ ์ ์๋ค.
case .์ฐ๊ด๊ฐ(var/let ๋ณ์๋ช )
ํน์case var/let .์ฐ๊ด๊ฐ(๋ณ์๋ช )
์ผ๋ก ๋ฐ์ธ๋ฉํ์ฌ ๋งค์นญ๋๋ ์ฐ๊ด๊ฐ์ ๊บผ๋ด์ ์ฌ์ฉํ ์ ์๋ค.- ๋ชจ๋ ์ฐ๊ด๊ฐ์ด ๋์ผํ๊ฒ ๋ณ์/์์๋ก ์ถ์ถ๋๋ค๋ฉด, ์ผ์ด์ค ์์ ํ ๋ฒ๋ง ์ธ ์๋ ์๋ค.
5. ์์๊ฐ(Raw Values)
์ด๊ฑฐํ์ ์ผ์ด์ค๋ ๋ฏธ๋ฆฌ ์ ํด์ง ๊ฐ, ์์๊ฐ์ ๊ฐ์ง ์ ์๋ค. ์ผ์ด์ค๋ ํญ์ ๋ค๋ฅธ ์์๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ผ์ด์ค ๋ณ ๋งค์นญ๊ฐ์ผ๋ก ์๊ฐํ๋ฉด ๋๋ค. ์์๊ฐ์ ์๋ฃํ์ด ํ ๋ฒ ์ ์ธ๋๋ฉด ์ผ์ด์ค๋ค์ ๋ชจ๋ ๊ฐ์ ์๋ฃํ์ ์์๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค. Hashable
ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ํ์
๋ค๋ง ์์๊ฐ์ ์๋ฃํ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ฆ, ๋ชจ๋ ์ผ์ด์ค๋ ๋์ผํ ์๋ฃํ์ผ๋ก ์์๊ฐ์ ๊ฐ์ ธ์ผ ํ๊ณ , ์ผ์ด์ค ๋ณ ์์๊ฐ์ ํ๋์ ๊ฐ๋ง ๊ฐ์ ธ์ผ ํ๋ค. ๋ํ ์ ์ธ์์ ์ ์ ์ฅํ ์์๊ฐ์ ๋์ค์ ๋ฐ๊ฟ ์ ์์ต๋๋ค. ์์๊ฐ์ ์ ์ฅํ๋ ๋ถ๋ถ์ ์๋ต๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ตํ ๊ฒฝ์ฐ, ์๋ฃํ ๋ง๋ค ๊ฐ๊ฐ ์์๊ฐ ๊ท์น์ด ์กด์ฌํฉ๋๋ค.
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
- ์ผ์ด์ค ๋ณ๋ก Character ํ์ ์์คํค ๊ฐ์ ์ ์ฅํ๊ณ ์๋ค.
5-1. ์์์ ์ผ๋ก ํ ๋น๋ ์์๊ฐ(Implicitly Assigned Raw Values)
์์๊ฐ์ ์๋ฃํ์ผ๋ก ์ ์๋ ๋ฌธ์์ด์ ์ฌ์ฉํ ์ ์๋๋ฐ, ๊ฐ ์ผ์ด์ค ๋ณ๋ก ๊ผญ ๋ช ์์ ์ผ๋ก ์์๊ฐ์ ํ ๋นํ ํ์๊ฐ ์๋ค. ๋ง์ฝ ์์๊ฐ์ ํ ๋นํ์ง ์์ผ๋ฉด swift์์ ์๋์ผ๋ก ๊ฐ์ ํ ๋นํด์ค๋ค. ์์๊ฐ์ ์๋ฃํ์ด Intํ์ด๋ผ๋ฉด ์ฒซ ์ผ์ด์ค๋ 0์ผ๋ก ์ ์๋๊ณ , ์ฐจ๋ก๋๋ก +1์ฉ๋ ๊ฐ์ผ๋ก ์๋ ์ง์ ๋๋ค. Stringํ์ด๋ผ๋ฉด ์ผ์ด์ค์ ์ด๋ฆ์ ์์๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
But,, Characterํ์ ์์๋ฑ๊น์ผ์ด ๋ถ๊ฐ๋ํ๊ณ ์ง์ ํ ๋นํด์ค์ผ ํ๋ค. ์ง์ ํ ๋นํด์ฃผ์ง ์์ผ๋ฉด ์ปดํ์ผ ์๋ฌ ๋ฐ์!
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
enum CompassPoint: String {
case north, south, east, west
}
let earthsOrder = Planet.earth.rawValue // 3
let sunsetDirection = CompassPoint.west.rawValue // "west"
- mercury์ 1์ ์ง์ ํ๋ฉด, ์ปดํ์ผ๋ฌ๋ mercury ๋ค์ ์ผ์ด์ค๋ค์ ์์๊ฐ์ผ๋ก +1์ฉ๋ ๊ฐ์ผ๋ก ์๋ ํ ๋นํด์ค๋ค. ๊ทธ๋์ earthsOrder์ ์์๊ฐ์ด 3์ด ๋๋ค.
- String ํ์ ์ ์์๊ฐ์ ์๋ฃํ์ผ๋ก ์ง์ ํด์ฃผ๊ณ ์ด๊ธฐํ์ํค์ง ์์๋ค๋ฉด, ์ผ์ด์ค์ ์ด๋ฆ์ ์์๊ฐ์ผ๋ก ๊ฐ์ ธ์จ๋ค. ๋ฐ๋ผ์ west ์ผ์ด์ค๋ “west”๋ฅผ ์์๊ฐ์ผ๋ก ๊ฐ์ง๊ฒ ๋๋ค.
[์คํ 1] Q. ๋ง์ฝ์ ์ผ์ด์ค ๊ฐ์ ๊ณต์ฐจ๊ฐ 1์ด ์๋ 3์ผ๋ก ๊ณต์ฐจ์์ด์ฒ๋ผ ๋ง๋ค ์ ์์๊น?
A. ๋ถ๊ฐ๋ฅํ๋ค! ์์๊ฐ์ ํ ๋นํ ์ผ์ด์ค์ ๋ฟ๊ธฐ ์ด์ ๊น์ง ์ฒซ ์ผ์ด์ค 0๋ถํฐ 1์ฉ ์ฆ๊ฐํ๊ณ , ์ผ์ด์ค ์ดํ๋ก๋ 1์ฉ ์ฆ๊ฐํ๋ค,,
enum DataStructure: Int, CaseIterable {
case array
case linkedList
case stack = 9
case queue = 12
case heap
case tree
case hashTable
case graph
}
for item in DataStructure.allCases {
print(item.rawValue)
}
0
1
9
12
13
14
15
16
[์คํ 2] Q. ์ผ์ด์ค์ ์์๊ฐ์ด 0์ผ ์ ์์๊น?
A. ๊ฐ์ฅ ์ฒ์ ์ผ์ด์ค๋ฅผ 0์ผ๋ก ์ค์ ํ๊ฑฐ๋, ๋ชจ๋ ์ผ์ด์ค๋ค์ ์์๊ฐ์ ํ ๋นํ์ง ์์๋ค๋ฉด ๊ฐ๋ฅํ๋ค!
๋ค๋ง, ์ค๊ฐ ์ผ์ด์ค๋ฅผ 0์ผ๋ก ์ค์ ํ๋ฉด Raw value for enum case is not unique๋ผ๋ ์๋ฌ๊ฐ ๋ฌ๋ค.
enum DataStructure: Int, CaseIterable {
case array = 0
case linkedList
case stack
case queue
case heap
case tree
case hashTable
case graph
}
enum DataStructure: Int, CaseIterable {
case array
case linkedList
case stack
case queue
case heap
case tree
case hashTable
case graph
}
0
1
2
3
4
5
6
7
enum DataStructure: Int, CaseIterable {
case array
case linkedList
case stack
case queue
case heap = 0
case tree
case hashTable
case graph
}
[์คํ 3] Q. ์ผ์ด์ค์ ์์๊ฐ์ด ์์์ผ ์ ์์๊น?
A. ๊ฐ์ฅ ์ฒ์ ์ผ์ด์ค๋ ์ค๊ฐ ์ผ์ด์ค๋ฅผ ์์๋ก ์ค์ ํด๋ดค๋๋ ๊ฐ๋ฅํ๋ค! ๋ฌผ๋ก ์์๊ฐ์ ๋ฃ์ด์ค ์ผ์ด์ค์ ์ค๊ธฐ ์ ๊น์ง 1์ฉ ์ฆ๊ฐํ๋ ํํ์๋ค.
enum DataStructure: Int, CaseIterable {
case array = -100
case linkedList
case stack
case queue
case heap = -10
case tree
case hashTable
case graph
}
-100 // array
-99
-98
-97
-10 // heap
-9
-8
-7
5-2. ์์๊ฐ์ผ๋ก ์ด๊ธฐํ(Initializing from a Raw Value)
์์๊ฐ์ ํตํด ์ด๊ฑฐํ ๋ณ์/์์๋ฅผ ์์ฑ/์ด๊ธฐํํด์ค ์ ์๋ค. ์์๊ฐ๊ณผ ๋งค์นญ๋๋ ์ผ์ด์ค๊ฐ ์๋ค๋ฉด, ์์๊ฐ์ ํตํด ์ด๊ธฐํํ ์ธ์คํด์ค๋ ์ต์ ๋ ํ์ ์ด๋ค. ์ฆ, ๋ง์ฝ ์๋ ์์๊ฐ์ ํตํด ์ด๊ฑฐํ์ ์์ฑํ๋ ค๊ณ ํ๋ค๋ฉด nil์ ๋ฐํํ๋ค.
enum Planet: Int {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let possiblePlanet = Planet(rawValue: 2)
let positionToFind = 2
if let somePlanet = Planet(rawValue: positionToFind) {
switch somePlanet {
case .earth:
print("๐")
default:
print("๐")
}
} else {
print("๐")
}
- ์์๊ฐ์ ์ง์ ํ ๋นํ์ง ์์ผ๋ฉด ๊ฐ์ฅ ์ฒซ ์ผ์ด์ค๋ถํฐ 0์ผ๋ก ์๋ ๋ฐฐ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์
possiblePlanet
๋Planet.earth
๊ฐ ๋์ง๋ง, ์ต์ ๋ Planet ํ์ ์ด๋ค. ๋ฐ๋ผ์ ์ฌ์ฉํ๋ ค๋ฉด ์ต์ ๋ ๋ฐ์ธ๋ฉ์ด ํ์ํ๋ค. positionToFind
๊ฐ 2๋ผ๋ฉด ์ต์ ๋ ๋ฐ์ธ๋ฉ๋somePlanet
์ดPlanet.earth
๋ก ์ด๋ก์ ํํธ๊ฐ ์ถ๋ ฅ๋๋ค.- 3์ด๋ผ๋ฉด ํ๋์ ํํธ๊ฐ ์ถ๋ ฅ๋๋ค. ์กด์ฌํ๋ ์์๊ฐ์ผ๋ก ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํต๊ณผํ์ง๋ง
Planet.earth
๊ฐ ์๋๊ธฐ ๋๋ฌธ์ default๋ฌธ์ ๊ฑธ๋ฆฐ๋ค. - -1์ด๋ผ๋ฉด ๋ณด๋ผ์ ํํธ๊ฐ ์ถ๋ ฅ๋๋ค. Planet์ ์๋ ์์๊ฐ์ผ๋ก ์ต์ ๋์ด๊ธฐ์.
- 3์ด๋ผ๋ฉด ํ๋์ ํํธ๊ฐ ์ถ๋ ฅ๋๋ค. ์กด์ฌํ๋ ์์๊ฐ์ผ๋ก ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํต๊ณผํ์ง๋ง
[์คํ 4] Q. ๋ง์ฝ์ ์๋ ์์๊ฐ์ผ๋ก ์ด๊ฑฐํ์ ์ด๊ธฐํํ๋ค๋ฉด?
A. ์ต์ ๋ Planet ํ์ ์ด์ง๋ง, ์ด๊ฑฐํ์ ์๋ ์์๊ฐ์ด๋ฏ๋ก ๊ฐ์ nil์ด ๋๋ค. ๋ํ ์์๊ฐ๋ nil์ด ๋๋ค.
let samplePlanet = Planet(rawValue: -1)
print(samplePlanet) // nil
print(samplePlanet?.rawValue) // nil
print(samplePlanet is Planet) // false
print(samplePlanet is Planet?) // true
6. ์ฌ๊ท ์ด๊ฑฐํ(Recursive Enumerations)
๋ค๋ฅธ ํน์ ๊ฐ์ ์ด๊ฑฐํ์ ์ธ์คํด์ค๋ฅผ ์ฐ๊ด๊ฐ์ผ๋ก ๊ฐ์ง๋ ์ด๊ฑฐํ์ด๋ค. ์ด๊ฑฐํ์ ์ผ์ด์ค๊ฐ ์ฌ๊ท์ ์์ ๋ํ๋ด๊ธฐ ์ํด indirect
ํค์๋๋ฅผ ๋ถ์ด๋๋ฐ, ์ฌ๊ทํ๋ ์ผ์ด์ค ์์ ๋ถ์ด๊ฑฐ๋(1๏ธโฃ) ํน์ ๋ชจ๋ ์ผ์ด์ค๋ค์ ๋ํด ์ ์ฉํ๊ณ ์ถ์ ๋์๋ ์ด๊ฑฐํ ์ ์ธ ์ ์ ๋ถ์ธ๋ค(2๏ธโฃ).
// 1๏ธโฃ
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
// 2๏ธโฃ
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, 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
์ด์ง ํ์ ํธ๋ฆฌ ๋ฑ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ๋์๋ indirect
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๊ฑฐ์จ to be continued,,
7. ๋น๊ต ๊ฐ๋ฅํ ์ด๊ฑฐํ
์ด๊ฑฐํ์ Comparable
ํ๋กํ ์ฝ์ ์ฑํํ๋ฉด ๊ฐ ์ผ์ด์ค๋ค์ ๋น๊ตํ ์ ์๋ค. ์ผ์ด์ค๋ ์์ ์์นํ ์๋ก ํฌ๊ธฐ๊ฐ ์๋ค.
8. ๋ฉ์๋
์ด๊ฑฐํ์๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
enum DataStructure: String, CaseIterable {
case array = "๋ฐฐ์ด(Array)"
case linkedList = "์ฐ๊ฒฐ ๋ฆฌ์คํธ(Linked List)"
case stack = "์คํ(Stask)"
case queue = "ํ(Queue)"
case heap = "ํ(Heap)"
case tree = "ํธ๋ฆฌ(Tree)"
case hashTable = "ํด์ ํ
์ด๋ธ(Hash Table)"
case graph = "๊ทธ๋ํ(Graph)"
func description() -> String {
let feature: String
switch self {
case .array: feature = "๋ฐ์ดํฐ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ"
case .linkedList: feature = "๋ฐ์ดํฐ ์์์ ๋
ธ๋๊ฐ ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก ๊ตฌ์ ๋ ์๋ฃ๊ตฌ์กฐ"
case .stack: feature = "LIFO(Last In First Out). ํ์
์ ์ถ๋ก ๋์ํ๋ ์๋ฃ๊ตฌ์กฐ"
case .queue: feature = "FIFO(First In First Out). ์ ์
์ ์ถ๋ก ๋์ํ๋ ์๋ฃ๊ตฌ์กฐ"
case .heap: feature = "์ต๋๊ฐ/์ต์๊ฐ์ ์ฐพ์๋ด๊ธฐ ์ํด ์์ ์ด์งํธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ ์๋ฃ๊ตฌ์กฐ"
case .tree: feature = "๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ ์๋ฃ๊ตฌ์กฐ"
case .hashTable: feature = "ํค(key)-๊ฐ(value) ์์ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ"
case .graph: feature = "๋
ธ๋(์ ์ )์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฐ์ (์ฃ์ง)์ผ๋ก ๊ตฌ์ฑ๋ ์๋ฃ๊ตฌ์กฐ"
}
return "\(self.rawValue): \(feature)"
}
}
print(DataStructure.hashTable.description()) // ํด์ ํ
์ด๋ธ(Hash Table): ํค(key)-๊ฐ(value) ์์ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ
์ฐธ๊ณ ์๋ฃ
- ์ผ๊ณฐ, ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ: Swift 5, ํ๋น๋ฏธ๋์ด, 2019, 102-113.
- https://youtu.be/uKJiaYYNJN4?si=siWF6BEqJjlQQpEE
- https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations
- https://babbab2.tistory.com/117
Swift) ์ด๊ฑฐํ(Enumeration) ์ฌํํธ
์๋ ํ์ธ์, ์๋ค์ ๋๋ค :) ์์ฆ ํฌ์คํ ์ ์ ์ํ๊ฒ ๋๋ ๊ฑฐ ๊ฐ์์ ์ธ์ ์์ฆ ์ ๋ชจํ ๋ ์ ๋ง ํ๊ธฐ ์ซ์ ์ผ์ด ์์ ๋ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ทธ ์ผ์ ๋นจ๋ฆฌ ํด๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ด.. ์ ๋
babbab2.tistory.com
[Swift] ์ฐ๊ด๊ฐ (Associated Values)
์ฐ๊ด๊ฐ?
sweetfood-dev.github.io
[Swift Language Guide] Enumerations(์ด๊ฑฐํ)
์๋ ํ์ธ์! ๋ฆด๋ฆฌ์ ๋๋ค๐๐ปโ๏ธ ์ค๋์ Swift Language Guide์ Enumerations ํํธ๋ฅผ ์ฝ์ด๋ณด๊ณ ๊ณต๋ถํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค๐
velog.io
enum ์ดํด๋ณด๊ธฐ - ์ฌ์ฉ๋ฒ
enumeration, ์ค์ฌ์ enum์ด๋ผ๊ณ ํ๋ ๊ฒ(์ด๊ฑฐํ์ด๋ผ๊ณ ๋ฒ์ญ๋ฉ๋๋ค.)์ ์๋ฏธ์์ผ๋ก ๊ด๋ จ๋ ๊ฐ๋ค์ ํน๋ณํ ์ด๋ฆ์ ๋ถ์ฌ ๋ชจ์๋์ ๊ฒ์ ๋๋ค. Swift์์์ enum์ ๋ค๋ฅธ ์ธ์ด์์๋ณด๋ค ํจ์ฌ ๋ค์ํ ๊ธฐ๋ฅ์
jcsoohwancho.github.io
[Swift ๊ณต์๋ฌธ์ ์ฝ๊ธฐ]Enumerations
์๋ ํ์ธ์. ์๋ฆผ์ ๋๋ค๐๐ปโ๏ธ Swift ๊ณต์ ๋ฌธ์๋ฅผ ์ ๋ ํ๊ธฐ 8ํธ์ ๋๋ค! ์ ์คํ์ผ๋๋ก ์ ๋ฆฌํ์ผ๋ ์ถ๊ฐ์ ์ผ๋ก ๋ ํ์ํ ์ ๋ณด๋๊ณต์๋ฌธ์ ๋งํฌ๋ฅผ ๋๋ฌ ํ์ธํด์ฃผ์ธ์ฉ! ์ข ๋ ํธํ๊ฒ ๋ณด๊ธฐ์ํด
velog.io
[Swift] Enum ์ด๊ฑฐํ ์ ๋ณตํ๊ธฐ 1ํธ (Raw, Associated Values)
์ด๊ฑฐํ(Enumeration)์ ์ฐ๊ด๋ ๊ฐ๋ค์ ์งํฉ์ ๊ณตํต๋ ํ์ ์ผ๋ก ์ ์ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฑฐํ์ type-safe ํ๊ฒ ์ฝ๋ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด์ฃ . ์ฃผ๋ก ์์ผ๊ณผ ๊ฐ์ด ํ์ ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ
onelife2live.tistory.com
'Swift ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Result (0) | 2024.08.14 |
---|---|
[Swift] Hashable ํ๋กํ ์ฝ (0) | 2024.05.24 |
[Swift] enumerated() (0) | 2024.05.24 |
[Swift] ํ์ ์บ์คํ (Type Casting) (0) | 2024.02.02 |