Swift Pattern Matching - несколько шаблонов enum-case-pattern в охране? - PullRequest
0 голосов
/ 26 мая 2020

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

Есть ли что-нибудь подобное для операторов 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")
}

1 Ответ

0 голосов
/ 26 мая 2020

Вам просто нужно указать условия, разделенные условием 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 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")
}
...