在 Swift 中的观察者方法中抛出错误

cat*_*res 5 validation error-handling swift

我正在尝试在属性观察器方法(didSetwillSet)中实现一些验证规则,并且我正在尝试throw在闭包中使用。这是一个说明性示例:

enum SomeClassError: ErrorType {
  case NumberNotPositive
}

class SomeClass {
  var PositiveNumber: Int {
    willSet(value) {
      guard value > 0 else {
        throw SomeClassError.NumberNotPositive
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,编译器会抱怨,Error is not handled because the enclosing function is not declared 'throws'我真的不知道didSet实际上在哪里声明throws

你知道是否有办法在属性观察器方法中抛出错误?

dfr*_*fri 1

您可以在属性观察者do-try-catch` 子句中调用一个函数,该函数会抛出,例如

enum SomeClassError: ErrorType {
    case NumberNotPositive
}

class SomeClass {
    var positiveNumber: Int {
        willSet {
            do {
                try newValueIsPositive(newValue)
            } catch SomeClassError.NumberNotPositive {
                print("Error: Number not positive")
            } catch {
                print("Error: Unknown error")
            }
        }
    }

    init() {
        positiveNumber = 1
    }

    func newValueIsPositive(newValue: Int) throws {
        guard newValue > 0 else {
            throw SomeClassError.NumberNotPositive
        }
    }
}

/* Example */
var a = SomeClass()
a.positiveNumber = 2
a.positiveNumber = -1   // Error: Number not positive
print(a.positiveNumber) // -1
Run Code Online (Sandbox Code Playgroud)

请注意,我newValue在使用属性观察器时使用了默认可访问的属性willSet(而不是value为之后设置的值显式定义属性名称willSet)。另请注意,在您当前的形式中,类属性positiveNumber仍然被分配-1(尽管ErrorType抛出了一个与此相关的案例)。