我正在尝试在属性观察者方法(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大小写).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。