我有一个枚举
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
}
但我不确定我需要覆盖什么。
谢谢你的时间。
如果你想只有uniq选项而不关心参数,那么只需改变你的功能。为了能够只传递感兴趣的选项,如果您根本不需要选项,则可以使用默认值+选项:
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中:
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")
}
如果您只想确保使用唯一元素调用函数,请改用Set
。它将保证所有元素uniq。