【问题标题】:Encapsulating property transformation/validation封装属性转换/验证
【发布时间】:2014-07-26 15:32:02
【问题描述】:

假设我需要编写一个 Foobar 类,并满足以下部分要求:

  • 它需要一个名为someProperty 的读写属性,
  • SomeProperty 是一个具有以下约束的整数:
    • 值必须在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 进行验证,但不知何故,这似乎是一个杂种。

【问题讨论】:

    标签: validation encapsulation getter-setter swift


    【解决方案1】:

    试试这个

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

    【讨论】:

      【解决方案2】:

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

      default: 
        self.someProperty = oldValue 
      

      保留旧的有效状态。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-17
        • 2021-11-17
        • 2013-01-06
        • 1970-01-01
        相关资源
        最近更新 更多