你如何在 CoreData 中存储 UInt64?

How do you store an UInt64 in CoreData?

我的理解是 UInt64 可以是从 0 到 18446744073709551615 的任何值

我需要将 UInt64 标识符保存到 CoreData,但我看到的值是:

我最初尝试使用 Integer 64,但现在我了解到其范围为:-9223372036854775808 至 9223372036854775807

开发者通常会把 UInt64 存储为 String 并在两种类型之间进行转换吗?这是最佳做法吗?

您可以(无损地)在 UInt64Int64 之间转换:

// Set:
obj.int64Property = Int64(bitPattern: uint64Value)

// Get:
let uint64Value = UInt64(bitPattern: obj.int64Property)

您可以将 uint64Value 定义为托管对象 class 的计算 属性 以自动转换:

@objc(MyEntity)
public class MyEntity: NSManagedObject {
    
    public var uint64Property: UInt64 {
        get {
            return UInt64(bitPattern: int64Property)
        }
        set {
            int64Property = Int64(bitPattern: newValue)
        }
    }
}

Martin R 接受的答案有效。

然而,这似乎是 Apple @NSManaged 属性的默认实现的一部分。

我是这样测试的:

  1. 我用 Core Data 创建了一个新的 Xcode 项目,并创建了一个名为 Hello 的实体。
  2. 它有一个名为 short 的属性,保存为 Integer 16
  3. 将 Codegen 标记为 Manual/None
  4. Hello 创建了手册 class 文件,如下所示:
class Hello: NSManagedObject {
    @NSManaged var short : UInt16
}

您会注意到我将其键入为无符号 UInt16

在我的 AppDelegate 中:

func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Get Context
        let context = self.persistentContainer.viewContext

        // Create Test Objects
        let hello1 = Hello(entity: Hello.entity(), insertInto: context)
        hello1.short = 255
        let hello2 = Hello(entity: Hello.entity(), insertInto: context)
        hello2.short = 266 // Should overflow Int16
        let hello3 = Hello(entity: Hello.entity(), insertInto: context)
        hello3.short = 65535 // Should overflow Int16 by a lot

        // Save them to the database
        do {
            try context.save()
        } catch {
            print(error)
        }
        
        // Fetch the save objects
        let fetch = NSFetchRequest<Hello>(entityName: "Hello")
        if let results = try? context.fetch(fetch) {
            for result in results {
                print(result.short)
            }
        }
    }

这将打印出以下内容:

255
266
65535

我想这是有人希望在 Core Data 中保存无符号整数。