封装属性转换/验证

时间:2014-06-05 14:58:52

标签: validation encapsulation getter-setter swift

想象一下,我需要编写一个Foobar类,其中包含以下部分要求:

  • 它需要一个名为someProperty
  • 的读写属性
  • SomeProperty是一个具有以下约束的Integer:
    • 值必须在0100(包含)之内。
    • 42是无效值;如果为SomeProperty提供了42,则将使用/存储下一个有效值(43)。

如何在Swift中实现?

class Foobar {
    var someProperty: Int = 0 {
        get {
            return someProperty
        }
        set {
            switch newValue {
            case 42:
                someProperty = 43
            case 0...100:
                someProperty = newValue
            default:
                someProperty = 0
            }
        }
    }
}

根据Property getters and setters,这是对setter的错误使用。如果是这样,它将如何编码?我不希望每个呼叫实体都必须验证Foobar。 Foobar应该验证自己(促进封装)。

foobarObject.someProperty = 42     // This is wrong, 42 is an invalid value, but how would Foobar enforce this?
println(foobarObject.someProperty) // Should print `43`, because 42 is invalid and it would use the next valid number

我已经玩弄了didSetwillSet进行验证的想法,但不知怎的,这似乎是一个污垢。

2 个答案:

答案 0 :(得分:3)

试试这个

class Foobar {
    var someProperty: Int = 0 {
        didSet {
            switch self.someProperty {
            case 42:
                self.someProperty = 43
            case 0...100:
                break;
            default:
                self.someProperty = 0
            }
        }
    }
}

答案 1 :(得分:1)

在Switch语句流程中,尝试添加以下行:

default: 
  self.someProperty = oldValue 

保留旧的有效状态。

相关问题