我正在尝试在属性观察者方法(didSet和willSet)中实现一些验证规则,我试图在闭包内使用throw.这是一个说明性的例子:
enum SomeClassError: ErrorType {
case NumberNotPositive
}
class SomeClass {
var PositiveNumber: Int {
willSet(value) {
guard value > 0 else {
throw SomeClassError.NumberNotPositive
}
}
}
}
当然,编译器抱怨Error没有被处理,因为封闭函数没有被声明’throws’,我真的不知道在哪里声明didSet实际抛出.
你知道是否有办法在属性观察者方法中抛出错误?
最佳答案 您可以在属性observersdo-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
请注意,在使用willSet属性observer时,我使用了默认可访问的newValue属性(而不是显式定义将在willSet之后设置的值的属性名称值).另请注意,在当前表单中,类属性positiveNumber仍会被赋值为-1(尽管会针对此抛出ErrorType大小写).