[Swift] enum μ—΄κ±°ν˜•

parkgyurimΒ·2022λ…„ 3μ›” 7일
0

Swift

λͺ©λ‘ 보기
2/8
post-thumbnail

μ •μ˜

Enumeration μ—΄κ±°ν˜•

An enumeration defines a common type for a group of related values and enables you to work with those values in a type-safe way within your code. - Swift document

즉, enum은 μ—°κ΄€λœ 값을 가진 그룹의 κ³΅λ™λœ μžλ£Œν˜•μ„ μ •μ˜ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μžλ£Œν˜•μž…λ‹ˆλ‹€.
type-safe : enum을 μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ›ν•˜μ§€ μ•ŠλŠ” 값이 잘λͺ» μž…λ ₯λ˜κ±°λ‚˜, 이미 μ •μ˜λ˜μ–΄ μ œν•œλœ κ°’ μ€‘μ—μ„œ 선택을 ν•˜λ„λ‘ν•˜μ—¬ 잘λͺ»λœ μžλ£Œκ°€ μž…λ ₯λ˜λŠ” 것을 방지

μ—΄κ±°ν˜•μ—μ„œ λ°μ΄ν„°λŠ” 객체 μ •μ˜ μ‹œμ μ— ν•¨κ»˜ μ •μ˜λ˜μ–΄ μ‚­μ œλ‚˜ 변경이 λΆˆκ°€λŠ₯ν•˜κ³  μ΄λ•Œ μ •μ˜λœ caseλ₯Ό .[caseName] 으둜 μ ‘κ·Όν•  수 있기 λ•Œλ¬Έμ— μ½”λ“œμ˜ μ •ν™•μ„±κ³Ό μ•ˆμ „μ„±μ„ 높이고 μ½”λ“œμ˜ 가독성도 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, Swift 의 μ—΄κ±°ν˜•μ€ μ›μ‹œκ°’ (raw value) λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 κ²½μš°μ— 따라 String, Character, Int, Float 을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


μ„ μ–Έ

raw value κ°€ μ—†λŠ” μ—΄κ±°ν˜•

enum CompassPoint {
    case north
    case south
    case east
    case west
}

raw value κ°€ μ—†λŠ” Enum 을 μ„ μ–Έν•  λ•ŒλŠ” enum의 이름과 ν•΄λ‹Ή enum이 κ°€μ§ˆ 수 μžˆλŠ” 값듀을 case둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var direction1  = CompassPoint.north
var direction2 : CompassPoint = .south

μœ„μ™€ 같이 μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•  수 있고, 미리 μ„ μ–Έλœ case의 κ°’λ“€λ‘œλ§Œ 선언을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€ πŸ“Œ

raw value κ°€ μžˆλŠ” μ—΄κ±°ν˜•

C λ‚˜ Objective-C μ—μ„œμ˜ Enumκ³Ό 달리 Swiftμ—μ„œλŠ” 기본적으둜 μ •μˆ˜κ°’μ΄ ν• λ‹Ήλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
λŒ€μ‹ , 각 case에 String, Character, Int, Float 을 raw value 둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

enum μ„ μ–Έμ‹œ raw value둜 κ°€μ§ˆ μžλ£Œν˜•μ„ λͺ…μ‹œν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€!

1. Number Type - Int, Double, Float

  • Int
enum CompassPoint : Int {
    case north		// 0
    case south		// 1
    case east		// 2
    case west		// 3
}

raw valueλ₯Ό Intν˜•μœΌλ‘œ μ„ μ–Έν•˜κ²Œ 되면 첫 caseκ°€ 0, λ‹€μŒ case λΆ€ν„° 1μ”© μ¦κ°€λœ 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

enum CompassPoint : Int {
    case north = 0		// 0
    case south			// 1
    case east = 10		// 10
    case west			// 11
}

λ˜ν•œ, νŠΉμ • 값을 μ„ μ–Έν•  수 있고 μ„ μ–Έλ˜μ§€ μ•ŠλŠ” case에 λŒ€ν•΄μ„œλŠ” 이전 case + 1 의 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.

  • Double, Float

Int ν˜•μ΄ μ•„λ‹Œ μžλ£Œν˜•μ— λŒ€ν•΄μ„œλŠ” λͺ¨λ“  case에 λŒ€ν•΄ raw valueλ₯Ό μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.

enum CompassPoint : Float {
    case north = 1.0		// 1.0
    case south = 2.0		// 2.0
    case east = 3.0			// 3.0
    case west = 4.0			// 4.0
}

μœ„μ™€ 같이 μ„ μ–Έν•˜κ±°λ‚˜, μƒλž΅ν•˜κ³  μ‹Άλ‹€λ©΄ 이전 case 의 raw valueλ₯Ό μ •μˆ˜κ°’μœΌλ‘œ μž…λ ₯ν•΄μ•Όν•©λ‹ˆλ‹€.

enum CompassPoint : Float {
    case north = 1.0		// 1.0
    case south = 2.0		// 2.0
    case east = 3			// 3.0
    case west				// 4.0
}

2. Character Type

enum CompassPoint : Character {
    case north = "N"
    case south = "S"
    case east = "E"
    case west = "W"
}

Character type 의 경우 λͺ¨λ“  case에 λŒ€ν•΄ raw valueλ₯Ό μ„ μ–Έν•΄μ•Όν•©λ‹ˆλ‹€!

3. String Type

enum CompassPoint : String {
    case north = "North"		// North
    case south = "South"		// South
    case east					// east
    case west					// west
}

String type 의 경우 μ„€μ •λ˜μ§€ μ•Šμ€ raw valueλŠ” case의 μ΄λ¦„μœΌλ‘œ μƒμ„±λ˜μ–΄ νŽΈν•˜κ²Œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ 😁


μ‚¬μš©

raw value κ°€ μ—†λŠ” μ—΄κ±°ν˜• μ‚¬μš©

enum CompassPoint {
    case north
    case south
    case east
    case west
}

var direction : CompassPoint? = .north

switch direction {
case .north : 
	print("head to north")
case .south : 
	print("head to south")
case .east :
	print("head to east")
case .west : 
	print("head to west")
default : 
	print("direction not found")

switch, for λ“± enum을 μ‚¬μš©ν•˜λ©΄ 가독성과 μ•ˆμ „μ„± 높은 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

raw value κ°€ μžˆλŠ” μ—΄κ±°ν˜• μ‚¬μš©

enum CompassPoint : Int {
    case north		// 0
    case south		// 1
    case east		// 2
    case west		// 3
}

var direction = CompassPoint.north
print(direction.rawValue) 	// Optional(0)

Enum의 raw value 접근은 .rawValue 둜 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λ•Œ Optional 값이 λ°˜ν™˜λ¨μ„ μ•Œκ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€! (raw value κ°€ 없을 경우 nil λ°˜ν™˜!)

Iterating over Enumeration Cases

enum의 이름 λ’€ : CaseIterable λ₯Ό μž…λ ₯ (Conforming CaseIterable Protocol) ν•˜κ³  [enumName].allCases 을 톡해 enum을 ν•˜λ‚˜μ˜ λ°°μ—΄μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

enum CompassPoint : CaseIterable {
    case north		
    case south		
    case east		
    case west
}

print(CompassPoint.allCases.count) // 4
for c in CompassPoint.allCases {
	print(c)
}
// north
// south
// east
// west 

마무리

μ˜€λŠ˜μ€ λ”μš± μ•ˆμ „μ„± λ†’κ³  가독성 높은 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆλŠ” enumeration μ—΄κ±°ν˜• μ—λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ enum의 심화 ν™œμš©μΈ Recursive Enumerations, Associated Values, Enum Extension 등에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€!

ν‹€λ¦° 정보 λ˜λŠ” κΆκΈˆν•œ 점이 μžˆλ‹€λ©΄ λŒ“κΈ€ λΆ€νƒλ“œλ¦½λ‹ˆλ‹€! μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€β€ΌοΈ

0개의 λŒ“κΈ€