[Swift🦩] #8列挙型


1. Enum ⭐️⭐️


グループの複数のインスタンスを表します.
enum CompassPoint {
    case north
    case south
    case east
    case west
}
によって区別することができます.
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
// 새로운 값을 정의할 때 이용할 수 있고,
var directionToHead = CompassPoint.west
label.textColor = UIColor.white

// 타입 유추가 가능하면 .만 찍어도 된다.
directionToHead = .east

2. Switch


switch文を使用してenumハウジングに従って処理できます.
switch文はすべての状況を考慮する必要があるため、すべての状況を考慮する必要がない場合はdefaultを使用して処理します.
directionToHead = .south
switch directionToHead {
case .north:
    print("Lots of planets have a north")
case .south:
    print("Watch out for penguins")
case .east:
    print("Where the sun rises")
case .west:
    print("Where the skies are blue")
}
// Prints "Watch out for penguins"

3. Iterating Cases


CaseIterableに従い、enumをIterableにすることができます.
使用時、Case.allcaseとして...count/文用...などのIterableオブジェクトに適用されます.
enum Beverage: CaseIterable {
    case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// Prints "3 beverages available"

4. Associated Values

enum Size {
    case large
    case small
}

enum Menu {
    case hamburger(String)
    case fries(String, Size)
    case beverage(String, Size)
}
スイッチドアとして使用できます.
var order = Menu.fries("cheese", .large)
switch order {
    case .hamburger(let patties): // 연관 값을 꺼내 쓸 수 있다.
        print("\(patties) 햄버거 입니다.")
    case .fries(let source, let size):
        print("\(source) 감자튀김 \(size) 사이즈 입니다.")
    case let .beverage(kind, size): // 전부 let 으로 쓸거면 이렇게.
        print("\(kind) \(size) 사이즈 입니다.")
}

5. Raw Values


各enumボックスには値があります.
逆に、各エンクロージャは同じタイプの値で充填する必要があります.
enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}


// Int 의 경우 첫번째 값을 채우면 다음에는 2 3 4 ... 로 알아서 채워진다.
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

// String 의 경우 특별히 지정하지 않으면, 케이스 이름이 raw value.
enum CompassPoint: String {
    case north, south, east, west
}

let planetNum = Planet.earth.rawValue // rawValue 로 접근할 수 있다.
let possiblePlanet = Planet(rawValue: 7) // 반대로 원시값을 이용해서 원래 케이스에 접근할 수 있다.

6. Recursive Enum


Enumは、関連付け値を独自のタイプenumとします.
enum ArithmeticExpression {
    case number(Int)
    // number + number
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    // number * number
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

// indirect 키워드를 앞으로 빼서 쓸 수도 있음.
indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}
この例では、計算に使用するケースを別途作成する必要があります.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))


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

print(evaluate(product))
// Prints "18"

実際の使用

enum Status {
    case login
    case signup
}

let status = Status.login
var urlString = ""
switch status {
    case .login: 
        url = "https://localhost:8080/user/login"
    case .signup: 
        url = "https://localhost:8080/user/signup"
}
リファレンス
https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations