【发布时间】:2018-02-07 19:03:40
【问题描述】:
我在 CoreData 中有一个实体,它有一个 Integer 16 类型的可选属性。它可以真正为 nil,在我的应用程序中我想将它称为 Int?类型。作为诠释? (或就此而言 Int16?)不是公认的 Objective-C 类型,编译器会抛出一些不稳定的问题。我想避免在整个过程中使用像 NSNumber?.intValue 这样的代码,所以我实际上已经使用此属性的自定义访问器设置了我的 ManagedObject 类型。我的问题与通过 #keyPath 而不是静态字符串来识别属性有关。在 Core Data 中,该字段在实体“用户”上被命名为“pin”。这是我的代码:
class User: NSManagedObject {
// MARK: - Properties
static let pinKey = "pin"
@NSManaged internal(set) var name: String
@NSManaged fileprivate var primitivePin: NSNumber?
internal(set) var pin: Int? {
get {
willAccessValue(forKey: #keyPath(pin)) // THIS LINE ERRORS
let value: Int? = primitivePin.map { $0.intValue }
didAccessValue(forKey: User.pinKey)
return value
}
set {
willChangeValue(forKey: User.pinKey)
primitivePin = newValue.map { NSNumber(value: Int16($0)) }
didChangeValue(forKey: User.pinKey)
}
}
}
错误的行是我“想要”实现的,但当然 var pin 不是 obj-c 类型并且编译器会抱怨,所以我已经定义了静态常量 pinKey,如您所见。 #keyPath 感觉是正确的方法,实体确实有一个名为 pin 的字段,但在这种情况下,我唯一可以选择使用静态值吗?
【问题讨论】: