【发布时间】:2019-01-24 17:14:55
【问题描述】:
我正在快速开发一个使用 Core Data 的 iOS 应用程序。我正在尝试实现一些核心数据验证。我还没有任何自定义逻辑,所以我使用模型中的“类定义”设置来让 Xcode 自动创建 NSManagedObject 子类。在这种情况下,根据文档,我可以将验证逻辑放在扩展中。我的代码如下所示:
extension Person {
func validateEmail(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {
var error: NSError? = nil
if let email = value.pointee as? String {
let regex = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
if !predicate.evaluate(with: email) {
let errorType = UserErrorType.invalidEmail
error = NSError(domain: errorDomain, code: errorType.rawValue, userInfo: [ NSLocalizedDescriptionKey : "The email address is invalid." ] )
}
} else {
let errorType = UserErrorType.invalidEmail
error = NSError(domain: errorDomain, code: errorType.rawValue, userInfo: [ NSLocalizedDescriptionKey : "The email address is invalid." ] )
}
if let error = error {
throw error
}
}
不幸的是,我的验证代码永远不会被调用。我知道它只有在实际保存上下文时才会被调用,但它永远不会被调用。我也在尝试:
let entity = NSEntityDescription.entity(forEntityName: "Person", in: self.persistentContainer.viewContext)
let person = NSManagedObject(entity: entity!, insertInto: self.persistentContainer.viewContext) as! Person
person.age = 16
person.hasDrivingLicense = true
person.email = "novalidemail"
do {
try person.validateForInsert()
} catch {
let validationError = error as NSError
print(validationError)
}
但我的验证方法永远不会被调用。我做的另一个测试是在扩展中像这样覆盖 validateValue:
public override func validateValue(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKey key: String) throws {
print("\(key)")
}
最后一个方法会被所有键调用,包括我所追求的“电子邮件”键。
【问题讨论】:
-
尝试在该方法的实现中调用
super.validateValue。 -
谢谢,我试过了,没有成功。