【问题标题】:How do I report error when setting a swift property?设置 swift 属性时如何报错?
【发布时间】:2015-02-18 15:26:02
【问题描述】:

鉴于 Swift 没有异常处理,当错误传递给属性的值不正确时,我如何将错误传达给调用者。本质上,属性可以进行验证吗?

这是一个例子。考虑下面的 numberOfShoes 属性。计算出来的

class Animal {
    var name : String
    var numberOfLegs : Int

    var numberOfShoes : Int {
        get {return numberOfLegs }
        set {
            if newValue < 0 {
                // TODO: WHAT GOES HERE?
            }

            numberOfLegs = newValue
        }
    }

    init(name : String, numberOfLegs : Int) {
        self.name = name
        self.numberOfLegs = numberOfLegs
    }
}

我们也可以(应该可能)在 numberOfLegs 上有一个 willSet / didSet 观察者,但我也看不到如何在这里完成验证。

我们是否需要坚持以下内容:

var cat = Animal("Cat", 4)
if !cat.setNumberOfLegs(3) {
   // I guess that didn't work...
}

其他人都在做什么?

【问题讨论】:

  • 为不正确的情况定义一个 default 值,并在您发现无效输入时使用该值设置属性 - 或调用引发异常的 fatalError(...) 和您的应用崩溃 - 或使用您在 setter 中接受的预定义值创建 enum
  • 谢谢holex。我或多或少地考虑了所有这些。我只是希望两者之间有一些中间立场。 fatalError (而不是某种可以优雅处理的错误),只是默默地不接受该值并使用另一个值(默认)。枚举是一个好主意,但并不总是一个选项(字符串、双精度等)。

标签: swift


【解决方案1】:

选项:

  1. 调用 fatalError 会导致应用崩溃
  2. 验证失败时提供默认值
  3. 如果验证失败,请勿更改 numberOfLegs 并注销错误消息
  4. 将 numberOfShoes 设为只读,而是提供一个函数来设置返回可选错误的鞋子数量:

    func setNumberOfShoes(number: Int) -> NSError? { // ... }

选项 4 最接近异常,因为它允许调用代码决定如何处理无效输入。当然,它不会强制调用者处理错误。

【讨论】:

    【解决方案2】:

    在 Swift 2 中,您有一个使用 setter 函数和错误处理的部分解决方案:

    class Animal {
    
        enum Error: ErrorType {
            case Invalid
        }
    
        var name : String
        var numberOfLegs : Int
        var numberOfShoes : Int {
            get {return numberOfLegs }
        }
    
        func setNumberOfShoes(n: Int) throws {
            if n < 0 {
                throw Error.Invalid
            }
            self.numberOfLegs = n
        }
        init(name : String, numberOfLegs : Int) {
            self.name = name
            self.numberOfLegs = numberOfLegs
        }
    }
    
    var cat = Animal(name: "Cat", numberOfLegs: 4)
    do {
        try cat.setNumberOfShoes(0)
        print("0 shoes is ok for an animal")
        try cat.setNumberOfShoes(-1)
    } catch Animal.Error.Invalid {
        print("but -1 is not")
    }
    

    最终,swift 将支持declaring a computed property that "throws"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多