Предупредить, когда массив имеет тот же регистр перечисления - PullRequest
0 голосов
/ 26 марта 2019

У меня есть перечисление

public enum Option {
    case first(CGFloat),
    case second(CGFloat),
    case third(Bool),
    case fourth
}

И функция, которая принимает массив этих перечислений

func gimme(the options: [Option]) -> Result

Что я хотел бы сделать, так это предупреждение / ошибка, когда кто-то добавляет два одинаковых случая, но я не знаю, как.

gimme(the: [first(1.0), second(2.0), third(false)]) // fine

gimme(the: [first(1.0), first(2.0), third(false]) // not fine

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

extension Array where Element == Option {

   // No idea how to do this
}

но я не уверен, что мне нужно переопределить.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 26 марта 2019

Если вы хотите иметь только уникальные опции без заботы об аргументах, просто измените свою функцию. Чтобы иметь возможность передавать только интересующие опции, вы можете использовать значения по умолчанию + опции, если вы вообще не хотите использовать опции:

func gimme(first: CGFloat? = nil, second: CGFloat? = nil, third: Bool? = nil, ...)
gimme(third: True)
func gimme(first: CGFloat = 0, second: CGFloat = 0, third: Bool = false, ...)
gimme(second: 10.2)

Если вы хотите иметь возможность передавать свои параметры между объектами, оберните их в структуру:

struct GimmedArguments {
    var first: CGFloat?
    var second: CGFloat?
    var third: Bool?
}

func gimme(the arguments: GimmedArguments) { ... }

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

gimme(the: var1, var2, var3)

Вы можете попытаться написать некоторые swiftlint правила или пользовательский скрипт, но ИМХО это может быть излишним.

Вместо этого вы можете добавить проверку во время выполнения как:

func myFunction(array: [Int]) {
    precondition(Set(array).count == array.count, "Array should not contain same elements")
}

Если вы просто хотите убедиться, что ваша функция вызывается с элементами uniq, используйте Set. Будет гарантировано, что все элементы уникальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...