Swift 정리 - Enumerations

김세영·2021년 12월 20일
0

Swift Doc 정리

목록 보기
7/17
post-thumbnail

관련된 값으로 이루어진 그룹을 공통 타입으로 선언해 Type-safety를 보장하여 코드를 다룰 수 있게 해준다.

  • C와 Objective-C가 Integer로 enum을 구성한 것에 비해, 스위프트는 String, Character, Int 등의 값을 사용할 수 있다.
  • 1급 클래스 형이기 때문에 Computed Property와 init 등을 사용할 수 있다.

Enumeration Syntax

enum CompassPoint {
    case north, south  // 한 줄에 ,로 구분해 선언 가능
    case east
    case west
}

var direction = CompassPoint.north
// or
var direction: CompassPoint = .north

...
direction = .east // direction이 CompassPoint형이므로 생략 가능

Matching Enumeration Values with a Switch Statement

switch문에서 열거형의 case를 매칭할 수 있다.
이 때 switch 안에서 열거형의 모든 케이스들이 매칭되어야 함.
혹은 default로 모두 매칭되도록 해야 한다.

switch direction {
case .north:
    ...
case .south:
    ...
}
// Compile Error

switch direction {
case .north:
    ...
case .south:
    ...
// 1 - default로 모두 매칭시킴
case default:
    ...
// 2 - 나머지를 모두 나열해 매칭시킴
case .east:
    ...
case .west:
    ...
}

Associated Values

case에 추가적인 정보를 저장할 수 있다.

enum OperatingSystem {
    case iOS(Int)
    case iPadOS(Int)
    case macOS(Int)
    case watchOS(Int)
}

var myPhoneOS: OperatingSystem = .iOS(15)

switch myPhoneOS {
    case .iOS(let version)
    // or case let .iOS(version):
        print("iPhone version: iOS \(version)")
    case .iPadOS(let version):
    // or case let .iPadOS(version):
        print("iPad version: iPadOS \(version)")
    case .macOS(let version):
    // or case let .macOS(version):
        print("MacBook Pro version: macOS \(version)")
    case .watchOS(let version):
    // or case let .watchOS(version):
        print("Apple Watch version: watchOS \(version)")
}

Raw Values / Implicitly Assigned Raw Values / Intializing from a Raw Value

case에 raw값을 지정할 수 있다.

enum Direction: String {
    case north = "Heading North"
    case south = "Heading South"
    case east = "Heading East"
    case west = "Heading West"
}

enum Direction: String {
    case north, south, east, west
    // Direction.north.rawValue : "north"
    // Direction.south.rawValue : "south"
    // Direction.east.rawValue : "east"
    // Direction.west.rawValue : "west"
}

let heading = Direction(rawValue: "east")
// heading : Optional(Direction.east)

Recursive Enumerations

다른 열거 인스턴스를 관계 값으로 갖는 열거형
indirect 키워드를 사용

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

let five = ArithmeticExpression.number(5) 
// five: .number(5)
let four = ArithmeticExpression.number(4) 
// four: .number(4)
let sum = ArithmeticExpression.addition(five, four) 
// sum = .addtion(.number(5), .number(4))
let product = ArithmeticExpression.multiplication(sum, .number(2))
// product = .multiplication(.addition(.number(5), .number(4)), .number(2))

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
        case let .number(value):
            return value
        case let .addition(left, right):
        // 2 - left: .number(5), right: .number(4)
            return evaluate(left) + evaluate(right)
        case let .multiplication(left, right):
        // 1 - left : .addtion(.number(5), .number(4)), right: .number(2)
            return evaluate(left) * evaluate(right)
    }
}

print(evaluate(product))
// 18
profile
초보 iOS 개발자입니다ㅏ

0개의 댓글