Swift Pattern Matching - несколько шаблонов enum-case в защите?

Каков правильный синтаксис для использования случаев перечисления и защиты, чтобы разрешить выполнение более одного случая?

С switch мы можем использовать case-item-list для объединения случаев переключения.

Есть ли что-нибудь подобное для операторов guard или if?

Вот пример кода вроде того, что я хотел бы сделать...

enum Thingy {
    case one
    case two
    case three
}

func doSomething(with value: Thingy) {
    switch value {
    case .one, .three:
        print("I like these numbers")
    default:
        print("Two")
    }
}

// Doesn't compile
func doSomethingAlt(with value: Thingy) {
    guard .one, .three = value else {
        print("Two")
        return
    }

    print("I like these numbers")
}


person edelaney05    schedule 25.05.2020    source источник


Ответы (1)


Вам просто нужно указать условия, разделенные условием OR (||). Вот как:

func doSomethingAlt(with value: Thingy) {
    guard value == .one || value == .three else {
        print("Two")
        return
    }

    print("I like these numbers")
}

Это потребует, чтобы enum соответствовало Equatable. Enums без связанных значений или с raw-type автоматически соответствует Equatable. Поскольку случаи перечисления Swift 4.1 даже с ассоциированными типами автоматически соответствуют Equatable. Вот код:

enum Thingy: Equatable {
    case one(String)
    case two
    case three
}
func doSomethingAlt(with value: Thingy) {
    guard value == .one("") || value == .three else {
        print("Two")
        return
    }

    print("I like these numbers")
}

И, поскольку связанный тип Swift 5.1 enum может иметь значения по умолчанию. Это замечательная функция, поэтому вам просто нужно сделать это:

enum Thingy: Equatable {
    case one(String = "")
    case two
    case three
}
func doSomethingAlt(with value: Thingy) {
    guard value == .one() || value == .three else {
        print("Two")
        return
    }

    print("I like these numbers")
}
person Frankenstein    schedule 25.05.2020
comment
Это требует, чтобы Thingy соответствовало Equatable,, что не является проблемой для моего игрушечного примера. - person edelaney05; 26.05.2020
comment
@edelaney05 Это правда! В противном случае вы можете использовать условие switch, которое будет правильным методом для обработки enums. - person Frankenstein; 26.05.2020
comment
@ edelaney05 Я обновил свой ответ и добавил факт о равном соответствии. Спасибо. - person Frankenstein; 26.05.2020