【发布时间】:2016-11-02 11:54:09
【问题描述】:
我正在阅读 Hillegass 的书,第 5 版,第 10 章,RaiseMan 示例。
他指出这个 Swift 2 代码:
class Employee: NSObject {
var name: String? = "New Employee"
var raise: Float = 0.05
}
//
//func validateRaise(raiseNumberPointer: AutoreleasingUnsafeMutablePointer<NSNumber?>, error outError: NSErrorPointer) -> Bool {
//
// let raiseNumber = raiseNumberPointer.pointee
// if raiseNumber == nil {
// let domain = "UserInputValidationErrorDomain"
// let code = 0
// let userInfo = [NSLocalizedDescriptionKey : "An employee's raise must be a number."]
// outError?.pointee = NSError(domain: domain, code: code, userInfo: userInfo)
// return false
// }
//
// return true
//}
当然,这在 Xcode 8.1、Swift 3.0.1 中不起作用。所以我尝试了:
```
枚举员工错误:错误{ 案例badRaise
}
func validateRaise(raiseNumberPointer: AutoreleasingUnsafeMutablePointer) 抛出 {
let i = 1
do {
guard let raiseNumber = try raiseNumberPointer.pointee else {
throw EmployeeError.badRaise
}
let domain = "UserInputValidationErrorDomain"
let code = 0
let userInfo = [NSLocalizedDescriptionKey : "An employee's raise must be a number."]
}
}
```
但是设置断点告诉我这段代码永远不会被调用。显然,在 IB 中,我按照指示转到了相应的 NSTextField 并立即检查了验证。这是我得到的错误:
```
2016-11-02 07:46:31.163900 RaiseMan[19240:1489479] [常规] 引发了未捕获的异常
2016-11-02 07:46:31.163986 RaiseMan[19240:1489479] [General] [setNilValueForKey]:无法将 nil 设置为键值提升。
```
如果有人知道正确的语法,那将非常有帮助。谢谢。
【问题讨论】: