iOS/🟠 Swift

[Swift] Enumeration 총정리

woozzang 2021. 3. 10. 12:16

- 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λ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.