Почему ~ = не работает с перечислениями и строками? - PullRequest
1 голос
/ 30 мая 2020

Пока я пытался ответить на другой вопрос, я обнаружил, что этот код не работает:

enum Response {
    case positive
    case negative
    case neutral
}

func ~=(pattern: Response, value: String) -> Bool {
    switch pattern {
    case .positive:
        return ["yep", "yes", "yay", "definitely", "ok", "correct"]
            .contains(value.lowercased())
    case .negative:
        return ["no", "nope", "nah", "definitely not", "no way"]
            .contains(value.lowercased())
    case .neutral:
        return ["meh", "don't know", "indifferent", "don't care"]
            .contains(value.lowercased())
    }
}

switch "yep" {
case Response.positive:
    print("That was a positive response")
case Response.negative:
    print("That was a negative response")
case Response.neutral:
    print("That was a neutral response")
default:
    print("Something else")
}

Я пытался использовать оператор ~=, чтобы разрешить сопоставление шаблонов между строками и Response enum, чтобы я мог классифицировать строки как положительный, отрицательный или нейтральный ответ (на приглашение).

Да, я мог бы записать строковые значения, которые я принимаю для каждого типа ответа, непосредственно в случаи переключения, например

case "yep", "yes", "yay", "definitely", "ok", "correct":
    print("That was a positive response")

Но я думаю, говоря case Response.positive создает еще один уровень абстракции и допускает позднее связывание. Я могу прочитать приемлемые ответы, например, из файла.

Насколько мне известно, первый фрагмент кода должен работать. Я определил оператор ~=. Я недвусмысленно указал значения перечисления в случаях переключения. В документации не сказано, что ~= не допускается в перечислениях. Даже print(Response.positive ~= "yep") печатает true. Но случаи переключения выдают ошибку:

Перечисление case 'positive' не является членом типа 'String'

(Конечно нет! Болван!: D)

Почему не работает и как исправить?

1 Ответ

1 голос
/ 30 мая 2020

Работает в следующих обозначениях. Протестировано с Xcode 11.4

switch "yep" {
case .positive:
    print("That was a positive response")
case .negative:
    print("That was a negative response")
case .neutral:
    print("That was a neutral response")
default:
    print("Something else")
}
...