[Swift] Enumeration μ΄μ 리
- 1μ°¨ μμ (2021.03.29)
- 2μ°¨ μμ (2021.05.07)
μ΄κ±°νμ 곡μλ¬Έμλ₯Ό ν΅ν΄ μ 리λ₯Ό νκ³ μ¬λ¬ λ² λ³΅μ΅νλ©΄μ λμΉ λ΄μ©μ΄λ μλ‘ κΉ¨λ«κ² λ μ μ κΈλ‘ λ¨κΉλλ€. ππ»
μλ£: Enumerations
κΈ°λ³Έ Syntax
enum Direction {
case north, south, east, west
}
// νΉμ
enum Direction {
case north
case south
case east
case west
}
μ΄κ±°νμ μ μΈνλ κ²μ μλ‘μ΄ μ»€μ€ν νμ μ λ§λλ κ²μ΄κ³ , κ·Έ νμ μ΄ κ°μ§ μ μλ κ°λ€μ μ μνλ κ²μ λλ€.
μ μ½λμ λ°λ₯΄λ©΄ Direction νμ μ north, south, east, west λΌλ κ°λ§ κ°μ§ μ μμ΅λλ€.
λ€λ₯Έ κ°μ μ¬μ©νλ €κ³ νλ©΄ μ»΄νμΌ μλ¬μ λλ€.
κ·Έλ λ€λ©΄ μΈμ μ΄κ±°νμ μ¬μ©ν κΉμ?
ν κ°μ§ μλ‘ μ€νΈλ§ 리ν°λ΄ λμ λμ μ΄κ±°νμ μ¬μ©νμ¬ switch λ¬Έμ caseλ₯Ό 맀μΉμν€λ©΄, λ³΄λ€ μμ ν μ½λκ° λ©λλ€.
μ€νΈλ§μ κ·Έλλ‘ μ¬μ©ν λ λ°μν μ μλ μ€νλ₯Ό λ°©μ§ν μ μκΈ° λλ¬Έμ λλ€.
λν Error νμ μ μ μν λλ μ΄κ±°νμ μ£Όλ‘ μ¬μ©ν©λλ€.
λ€λ₯Έ μΈμ΄μλ λ€λ₯Έ Swift μ΄κ±°νμ νΉμ§
var whertToGo = Direction.north
switch wherToGo {
case .north:
print("Go to the North")
default:
print("Have no idea")
}
//C μΈμ΄ μμλ μ μ κ°μΌλ‘λ switch λ¬Έμμ λΆκΈ°ν μ μμ΅λλ€.
switch (whereToGo) {
case 0:
...
}
κΈ°λ³Έ Syntax λ‘ μ΄κ±°νκ³Ό caseλ₯Ό μ μΈνμμ λ, caseλ κ·Έ μ체 κ°λ§μ κ°μ§κ³ , κ·Έ μΈμ λ°λ‘ λ€λ₯Έ κ°μ κ°μ§μ§ μμ΅λλ€.
λ°λ‘ λ€λ₯Έ κ°μ κ°μ§ λ€λ μλ―Έλ, CμΈμ΄λ₯Ό μλ‘ λ€λ©΄ CμΈμ΄μμλ 첫 λ²μ§Έ case λ₯Ό κ·Έ μ체 μΈμ 0μ΄λΌλ κ°μΌλ‘ λ체ν΄μ μ¬μ©ν μλ μμ΅λλ€.
λ€λ₯Έ κ°μ κ°μ§κ² νλ €λ©΄ μλμμ μ€λͺ νλ Associated Value λ Raw Value λ₯Ό μ μΈν΄μΌ ν©λλ€.
// λ³μ νΉμ μμκ° νμ
μ μ΄λ―Έ μλ κ²½μ°μλ μ΄κ±°ν μ΄λ¦μ μλ΅ν μ μμ΅λλ€.
whereToGo = .east
var myWay: Direction = .west
λν λ³μλ μμμ νμ μ μΆλ‘ ν μ μλ€λ©΄ μ΄κ±°νμ νμ λͺ μ μλ΅ν μ μμ΅λλ€.
Associated Value
enum Barcode: Equatable {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDE")
"Additional information alongside case values" - Swift.org
μ°κ΄ κ°μ case κ° κ°μ§λ μΆκ°μ μΈ μ 보μ λλ€.
case μ μΆκ°μ μΈ μ 보λ€μ κ°μ΄ μ μ₯νκ³ μΆμ κ²½μ°μ μ μΈν©λλ€.
κ·Έλ¦¬κ³ μ°κ΄ κ°μ κ²½μ° caseκ° κ°μ λΉκ΅λ Equatable νλ‘ν μ½μ μ±νν΄μΌ κ°λ₯ν©λλ€.
productBarcode = .upc(8, 85909, 51226, 3)
var newProductBarcode = Barcode.upc(9, 34782, 13583, 1)
κ·Έλ¦¬κ³ κ°μ caseλΌλ λ€λ₯Έ κ°μ κ°μ§κ³ μμ μ μμ΅λλ€.
μμ λ λ³μ productBarcode μ newProductBarcode λ λ λ€ Barcode μ΄κ±°ν νμ μ upc μΌμ΄μ€ μ΄μ§λ§, Associated Value κ° λ€λ₯΄λ―λ‘ λ€λ₯Έ κ°μ΄ λ©λλ€.
μ°κ΄κ°μ μ κ·Όμ λ³΄ν΅ μλμ κ°μ΄ switch μμ κ°μ λ°μΈλ©νμ¬ μ κ·Όν©λλ€.
enum myCase {
case numbers(Int, Int)
}
var value = myCase.numbers(3, 1)
switch value {
case let .numbers(test1, test2): // λ³μ value μ μ°κ΄κ° 3μ μμ test1μ λ°μΈλ© νλ μ½λ
...
case .numbers(let test1, var test2): // test1 μ μμλ‘ λ°μΈλ©νκ³ , test2 λ λ³μλ‘ λ°μΈλ© νλ μ½λ
...
case .nubmers(_, var test2): // 첫λ²μ§Έ μ°κ΄κ°μ μμΌλμΉ΄λ ν¨ν΄μΌλ‘ λ°μΈλ© μλ΅νμλ€.
...
}
Raw Value
enum Number: Int { // ν€λ λΆλΆμ μ μΈν RawValue μ νμ
μ κΈ°μ¬ν©λλ€.
case one = 1
case two = 2
case three = 3
}
var myNumber = Number(rawValue: 1)
// rawValue μμ±μΌλ‘ μ κ·Ό κ°λ₯
print( myNumber.rawValue )
// λ€μμ κ²°κ³Όλ?
myNumber = Number(rawValue: 100)
"Prepopulated value"
Raw Valueλ 미리 μ±μμ Έ μλ κ°μΌλ‘ λͺ μμ μΌλ‘ μ μΈ μμ κ·Έ κ°μ΄ κ²°μ λ©λλ€.
μ μ½λμμ case one, two, three λ κ°κ° 1, 2,3 μ΄λΌλ Raw Value λ₯Ό κ°μ§κ³ μμ΅λλ€.
case μ Raw Value λ .rawValue μμ±μΌλ‘ μ κ·Όν©λλ€.
κ·Έλ°λ° μ§μ μ μΈνμ§ μμλ RawValue κ° μλμΌλ‘ μ±μμ§λ λ κ°μ§ κ²½μ°κ° μμ΅λλ€.
>>> Raw Value <<< μ΄ κΈμ μ°Έκ³ ν΄μ£ΌμΈμ!!!π
Method μ μΈμ΄ κ°λ₯νλ€
μ΄κ±°νλ μΈμ€ν΄μ€ λ©μλμ νμ λ©μλμ μ μΈμ΄ κ°λ₯ν©λλ€.
enum Direction {
case north, south, east, west
func instance() {
print("Instance Method")
}
static func type() {
print("Type Method")
}
}
Direction.north.instance() // "Instance Method"
// Direction.north.type() -> Compile Error
Direction.type() // "Type Method"
CaseIterable
κ΄λ ¨ κΈμ λ°λ‘ μ 리νμμ΅λλ€.
Recursive Enumeration
'indirect' ν€μλλ₯Ό μμ λΆμ΄λ©΄, μ΄κ±°νμ κ°μ§λ case λ₯Ό λ§λ€ μ μμ΅λλ€.
μμΈν λ΄μ©μ μ¬μ©ν κ²½μ°κ° μμ λ λ€μ νλ² μ 리νκ² μ΅λλ€.
λ!
π€π’[μ°μ§±μ iOS λΈλ‘κ·Έ]π΅π»
iOSλ₯Ό 곡λΆνλ©΄μ λ°°μ΄ λ΄μ©μ κΈ°λ‘νκ³ μμ΅λλ€.