Swift、核心数据、可选的 Integer16 和 keyPath

标签 swift core-data

我在 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/

相关文章:

swift - UserDefaults 不存储自定义 Swift 类属性

swift - relativeDateTimeFormatter 表示 2 天前的日期是昨天

ios - RestKit POSTing multipartFormRequest 与字典参数会在数据中添加反斜杠

ios - NSPersistentContainer 等效于 NSPersistentStoreCoordinator.addPersistentStore ofType 和选项

ios - 删除/重置核心数据中的所有条目?

objective-c - 将 swift 代码桥接到 obj c 项目中

ios - 如何使用 alert 来确认或取消 View 转换?

ios - 核心数据更新或创建查找更新

ios - NSInMemoryStoreType 类型的核心数据忽略实体的约束

ios - 如何在 iOS 中使用 swift 重新定位 View ?