"Варианты перечисления 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)
}

См. Примечания к выпуску Swift

Вы можете использовать статические функции для имитации случаев с переменным аргументом:

      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"))
Другие вопросы по тегам