Swift枚举 - 约束关联值

4

我有一个枚举类型,用于表示线条的粗细,可以是固定宽度,也可以是相对于视图大小的宽度。

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))
        }
    }
}

但是,如果我只需为整个类型执行一次此操作,而不是为每个属性复制此观察器,那将更加简洁。
我知道可以为枚举创建初始化程序或方法,但我不确定如何使用它来约束相关值?
1个回答

2

好的,这种方式可能不是最优雅的,但至少可以避免因为忘记添加观察者而导致的错误。

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)
        }
    }
}

谢谢你的回答。我同意这并不是非常优雅的解决方案 - 我真的很喜欢在创建变量时枚举类型的表现力,但遗憾的是似乎没有更好的方法来实现我想要的功能。我想在指定约束条件时,它超出了枚举类型的本意。或许随着语言的发展,将来可能会有更好的解决方案。 - Stuart
另外,希望你不介意,我重构了你的 switch 语句(我个人认为这样读起来更好)。如果你不喜欢,随时可以回滚编辑 :) - Stuart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接