我正在尝试在属性观察者方法(didSet
和willSet
)中实现一些验证规则,我试图在闭包内使用throw
。这是一个说明性的例子:
enum SomeClassError: ErrorType {
case NumberNotPositive
}
class SomeClass {
var PositiveNumber: Int {
willSet(value) {
guard value > 0 else {
throw SomeClassError.NumberNotPositive
}
}
}
}
当然,编译器抱怨Error is not handled because the enclosing function is not declared 'throws'
我真的不知道在哪里didSet
实际throws
。
你知道是否有办法在属性观察者方法中抛出错误?
答案 0 :(得分: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
请注意,我在使用newValue
属性观察器时默认使用willSet
属性(而不是明确定义属性名value
作为{{1}之后设置的值}})。另请注意,在您当前的表单中,类属性willSet
仍然会被分配positiveNumber
(尽管有-1
案例被抛出)。