【发布时间】:2021-01-29 09:29:28
【问题描述】:
Core Data Programming Guide - Object Validation 更新到 Swift 3,建议使用 Objective-c 运行时的键值编码的键值验证是执行单个属性验证的推荐方法。
随着近年来 Swift 和 iOS 的演进,这种方法是否仍然代表最佳实践?在现代 iOS 中应用该技术时有哪些实际注意事项?
例如,
@objc(AuthorMO)
public class AuthorMO: NSManagedObject, Identifiable {
@NSManaged public var uuid: UUID?
@NSManaged public var name: String?
}
// MARK: Key-Value Property Validation
extension AuthorMO {
@objc public func validateUuid(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {
guard let newValue = value.pointee as? UUID else { return }
// Custom property validation.
}
@objc public func validateName(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {
guard let newValue = value.pointee as? String else { return }
// Custom property validation.
}
}
// MARK: LifeCycle Validation Alternative
// previously mainly used for inter-properties validation.
extension AuthorMO {
public override func validateForInsert() throws {
try super.validateForUpdate()
try propertyValidations()
}
public override func validateForUpdate() throws {
try super.validateForUpdate()
try propertyValidations()
}
public func propertyValidations() throws {
try validateUUID()
try validateName()
}
public func validateUUID() throws {
let newValue = primitiveValue(forKey: #keyPath(AuthorMO.uuid))
// Custom property validation
}
public func validateName() throws {
let newValue = primitiveValue(forKey: #keyPath(AuthorMO.name))
// Custom property validation
}
}
【问题讨论】: