我在 CoreData 中有一个实体,它有一个类型为 Integer 16 的可选属性。它真的可以是 nil,而在我的应用程序中我想将它称为 Int 吗?类型。作为情报? (或者就此而言 Int16?)不是公认的 Objective-C 类型,编译器会抛出一些不稳定的问题。我想避免在整个过程中使用像 NSNumber?.intValue 这样的代码,所以我实际上已经为这个属性设置了带有自定义访问器的 ManagedObject 类型。我的问题涉及通过 #keyPath 而不是静态字符串来识别属性。在核心数据中,该字段在实体“用户”上被命名为“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 的字段,但在这种情况下,我唯一可以使用静态值的选项是什么?
最佳答案
在 #keyPath
中,您必须指定属性名称。如果您没有定义名为 pin
的属性,您将收到错误消息。在您的情况下,您必须使用 #keyPath(User.primitivePin)
。我相信这应该有效。
另外,我想,在这里调用 map 是多余的。可以直接写let value = primitivePin?.intValue
等
关于Swift、核心数据、可选的 Integer16 和 keyPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48671444/