Пока я пытался ответить на другой вопрос, я обнаружил, что этот код не работает:
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)
Почему не работает и как исправить?