"Варианты перечисления Variadic не поддерживаются" ошибка swift 5
Я получаю Variadic enum cases are not supported
ошибка в следующем коде. Это компилировалось и работало нормально в Swift4, но приводило к ошибке времени компиляции в Swift5, Xcode 10.2
enum ModelRule {
case required(keys: String...) // error: Variadic enum cases are not supported
case nonEmptyString(keys: String...) // error: Variadic enum cases are not supported
case emptyString(key: String)
}
хотя сообщение очень четкое, я хотел бы знать, почему они удаляют идеально работающую функцию? Или я что-то здесь упускаю?
Кроме того, есть ли лучшее решение для вышеуказанной ошибки, чем после?case required(keys: [String])
3 ответа
Расширяем комментарий:
У вас должны быть массивы в связанных значениях кейсов. Но для удобства создайте методы с вариативными параметрами.
Пример:
enum ModelRule {
case required(keys: [String])
case nonEmptyString(keys: [String])
case emptyString(key: String)
init(required keys: String...) { // It could be static func, but init here works and looks better
self = .required(keys: keys)
}
init(nonEmptyString keys: String...) {
self = .nonEmptyString(keys: keys)
}
init(emptyString key: String) { // Added this just for my OCD, not actually required
self = .emptyString(key: key)
}
}
Применение:
let required = ModelRule(required: "a", "b", "c") // .required(keys: ["a", "b", "c"])
let nonEmpty = ModelRule(nonEmptyString: "d", "e", "f") // .nonEmptyString(keys: ["d", "e", "f"])
let empty = ModelRule(emptyString: "g") // .emptyString(key: "g")
Параметр Variadic раньше работал на swift 4, но не был намеренно. Просто используйте массивы
enum ModelRule {
case required(keys: [String])
case nonEmptyString(keys: [String])
case emptyString(key: String)
}
Вы можете использовать статические функции для имитации случаев с переменным аргументом:
enum ModelRule {
case required(keys: [String])
case nonEmptyString(keys: [String])
case emptyString(key: String)
static func required(keys: String...) -> Self {
.required(keys: keys)
}
static func nonEmptyString(keys: String...) -> Self {
.nonEmptyString(keys: keys)
}
}
Применение:
ruleChecker.apply(rule: .required(keys: "a", "b", "c"))