iOS

[ iOS ] μ—΄κ±°ν˜•μ˜ μ›μ‹œκ°’μœΌλ‘œ νŠœν”Œ μ‚¬μš©ν•˜κΈ°

Forest Yun 2023. 12. 1. 16:06
728x90

 
 

enum Direction: String {
   case up = "상"
   case down = "ν•˜"
   case left = "쒌"
   case right = "우"
}

let direction: Direction = .right
print(direction.right)
/// print "우"

 
μ—΄κ±°ν˜•μ—λŠ” μ›μ‹œκ°’(rawValue)이 μžˆμ–΄ μœ„μ˜ μ˜ˆμ‹œμ²˜λŸΌ 값을 caseλ³„λ‘œ 값을 ν• λ‹Ήν•΄ ν•„μš”ν•  λ•Œ κΊΌλ‚΄ μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ ν•œ 가지 μœ μ˜ν•  점은, 이 μ›μ‹œκ°’μ€ Literal νƒ€μž…λ§Œ κ°€λŠ₯ν•˜λ‹€.
 
Literal은 κ³΅μ‹λ¬Έμ„œμ—μ„œ "μˆ«μžλ‚˜ λ¬Έμžμ—΄ 같은 νƒ€μž…μ˜ κ°’ ν‘œν˜„"이라 μ„€λͺ…λ˜μ–΄ μžˆλ‹€. κ·Έλ ‡λ‹€κ³  νƒ€μž…μ„ κ°–κ³  μžˆμ§€λŠ” μ•Šλ‹€. ν•˜μ§€λ§Œ literal은 μ•„μ£Όμ•„μ£Ό μ •ν™•ν•˜μ—¬ Swift의 νƒ€μž… μΆ”λ‘  κΈ°λŠ₯을 μ‚¬μš©ν•΄ νƒ€μž…μ΄ μΆ”λ‘ λœλ‹€. λ”°λΌμ„œ Literal은 Swift ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” νƒ€μž…μ„ μ€€μˆ˜ν•΄μ•Όν•œλ‹€. 즉 μ—΄κ±°ν˜•μ˜ μ›μ‹œκ°’ νƒ€μž…μ— ν‘œμ€€ 라이브러리 νƒ€μž…μ„ ν• λ‹Ήν•˜μ§€ μ•ŠμœΌλ©΄ μ•„λž˜μ™€ 같은 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

raw value for enum case must be a literal

 
 
ν•˜μ§€λ§Œ λ‚˜λŠ” 이차원 배열을 μž‘μ—…ν•˜κ³  μžˆμ–΄μ„œ ν–‰κ³Ό 열을 μ—΄κ±°ν˜•μ˜ μ›μ‹œκ°’μ— ν• λ‹Ήν•˜κ³  μ‹Άμ—ˆλ‹€. ꡬ글링을 ν†΅ν•΄μ„œ λ³Έ 해결법은 struct에 ν•΄λ‹Ήν•˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό λ‘λŠ” κ²ƒμ΄μ—ˆλŠ”λ°, switch문을 μ‚¬μš©ν•΄ case별 μž‘μ—…μ„ ν•  μ˜ˆμ •μ΄λΌ μ—΄κ±°ν˜•μ΄ ν•„μš”ν–ˆλ‹€. 그러던 쀑 μƒκ°λ‚œ 방법은 μ›μ‹œκ°’μ„ λ”°λ‘œ ν”„λ‘œνΌν‹°λ‘œ 두어 ν•΄λ‹Ή ν”„λ‘œνΌν‹°λ₯Ό λŒ€μ‹  μ‚¬μš©ν•˜λŠ” λ°©λ²•μ΄μ—ˆλ‹€.
μ›μ‹œκ°’μ€ .rawValue둜 λ°”λ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, ν”„λ‘œνΌν‹°λͺ…μ—μ„œ κ°’μ˜ μ˜λ―Έκ°€ 잘 λŠκ»΄μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ”°λ‘œ ν”„λ‘œνΌν‹°λ₯Ό 생성해 μ‚¬μš©ν•œ 적이 μžˆμ—ˆλ‹€. μ•„λž˜μ™€ 같은 μ—°μ‚°ν”„λ‘œνΌν‹° μ•ˆμ—μ„œ switch문을 μ‚¬μš©ν•΄ case별 λ°˜ν™˜κ°’μ„ λ‹€λ₯΄κ²Œ ν•˜λ©΄ λ˜μ§€ μ•Šμ„κΉŒ?

enum Direction: String {
   case up = "상"
   case down = "ν•˜"
   case left = "쒌"
   case right = "우"
   
   var current: String {
      self.rawValue
   }
}

 
 
 
 
 
switch문을 μ‚¬μš©ν•΄ μ •λ¦¬ν•˜λ©΄ μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν•  수 μžˆλ‹€. 더해 μ—°μ‚°ν”„λ‘œνΌν‹°μ˜ νƒ€μž…μ— typealiasλ₯Ό μ‚¬μš©ν•˜λ©΄ 더 κΉ”λ”ν•œ μ½”λ“œκ°€ λœλ‹€.
 


    typealias DirectionDetail = (row: Int, column: Int)
    
    enum Direction {
        case up
        case right
        case down
        case left
        
        var value: DirectionDetail {
            switch self {
            case .up:
                return (-1, 0)
            case .right:
                return (0, 1)
            case .down:
                return (1, 0)
            case .left:
                return (0, -1)
            }
        }
    }

 
 
 
 
 

728x90