Swift enum - 约束关联值
Swift enum - constrain associated values
我有一个代表线宽的枚举,它可以是恒定宽度,也可以是相对于它所在视图大小的宽度。
enum Thickness {
case Constant(Float) // where value ≥ 0
case Relative(Float) // where 0 ≤ value ≤ 1
}
有没有办法将这些关联值约束构建到枚举类型中?我目前在这种类型的属性上使用 didSet
属性 观察者:
var lineThickness: Thickness {
didSet {
switch lineThickness {
case let .Relative(x): lineThickness = .Relative(min(max(x, 0), 1))
case let .Constant(x): lineThickness = .Constant(max(x, 0))
}
}
}
但是如果我可以对整个类型执行一次,而不是为每个 属性.
复制这个观察者,那就更整洁了
我知道我可以为枚举创建初始化程序或方法,但我不确定if/how我可以用它来约束关联值吗?
好吧,虽然不是最优雅的,但至少可以避免因忘记观察者而导致的错误...
struct Thickness {
enum Type {
case Constant
case Relative
}
let type: Type
let value: Float
init(type: Type, value: Float) {
self.type = type;
switch type {
case .Constant:
self.value = max(value, 0)
case .Relative:
self.value = min(max(value, 0), 1)
}
}
}
我有一个代表线宽的枚举,它可以是恒定宽度,也可以是相对于它所在视图大小的宽度。
enum Thickness {
case Constant(Float) // where value ≥ 0
case Relative(Float) // where 0 ≤ value ≤ 1
}
有没有办法将这些关联值约束构建到枚举类型中?我目前在这种类型的属性上使用 didSet
属性 观察者:
var lineThickness: Thickness {
didSet {
switch lineThickness {
case let .Relative(x): lineThickness = .Relative(min(max(x, 0), 1))
case let .Constant(x): lineThickness = .Constant(max(x, 0))
}
}
}
但是如果我可以对整个类型执行一次,而不是为每个 属性.
复制这个观察者,那就更整洁了我知道我可以为枚举创建初始化程序或方法,但我不确定if/how我可以用它来约束关联值吗?
好吧,虽然不是最优雅的,但至少可以避免因忘记观察者而导致的错误...
struct Thickness {
enum Type {
case Constant
case Relative
}
let type: Type
let value: Float
init(type: Type, value: Float) {
self.type = type;
switch type {
case .Constant:
self.value = max(value, 0)
case .Relative:
self.value = min(max(value, 0), 1)
}
}
}