如何在 Swift Int64 中使用 Core Data Integer 64?

Posted

技术标签:

【中文标题】如何在 Swift Int64 中使用 Core Data Integer 64?【英文标题】:How to use Core Data Integer 64 with Swift Int64? 【发布时间】:2014-06-22 11:15:19 【问题描述】:

我在一个实体上有一个 CoreData 属性,我想在该实体上存储大于 Int32.maxUInt32.max 的整数值。该值用作索引,因此查找性能很重要。所以我选择在 CoreData 中使用 Integer 64 作为数据类型。

现在我正在努力研究如何在我的实体实例上存储 Int64。另请参阅我尝试过的以下不同方法。

使用NSNumber

import Foundation
import CoreData

class Node : NSManagedObject 
    @NSManaged var id : NSNumber


node.id = Int64(1)
> 'Int64' is not convertible to 'NSNumber'

使用NSInteger

import Foundation
import CoreData

class Node : NSManagedObject 
    @NSManaged var id : NSInteger


node.id = Int64(1)
> 'Int64' is not convertible to 'NSInteger'

使用Int64

import Foundation
import CoreData

class Node : NSManagedObject 
    @NSManaged var id : Int64


node.id = Int64(1)
> EXC_BAD_ACCESS (code=1, address=...)

应该如何定义/分配属性以使用 64 位整数?

【问题讨论】:

【参考方案1】:

您可以在托管对象子类中将“Integer 64”属性定义为NSNumber

@NSManaged var id : NSNumber

设置值:

let value:Int64 = 20000000000000000
node.id = NSNumber(longLong: value)

检索值:

let value:Int64 = node.id.longLongValue

请注意,long long 在 32 位和 64 位架构上都是一个 64 位整数。


定义属性为

@NSManaged var id : Int64

// ...
node.id = Int64(...) 

应该也可以工作,因为 Core Data 支持原始的标量访问器方法 数据类型。分配值时的EXC_BAD_ACCESS 异常在我看来 就像 Swift 编译器或运行时中的错误。布尔属性的类似问题 在这里报道

EXC_BAD_ACCESS error when trying to change Bool property

据报道 NSNumber 属性可以工作,但标量 Bool 属性 导致同样的异常。

【讨论】:

使用您建议的解决方法NSNumber(longLong: value) 有效。我同意你的观点,后者可能是 Swift 中的一个错误。 Int64 在 32 位架构 (18113807) 上导致陷阱的问题已在 Xcode 6.1 beta 中得到修复。 你认为它在 xcode 6.1 beta 中修复了吗?我在 xcode 11.2.1 中仍然面临这个问题

以上是关于如何在 Swift Int64 中使用 Core Data Integer 64?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 Int 和 Int32 有啥区别?

如何在 Core Data 中使用 swift 4 Codable?

如何在 Core Data 中使用 swift 4 Codable?

如何在 Core Data 中使用 swift 4 Codable?

如何使用 Swift 在 Core Data 中组合属性?

Swift、Core Data、可选的 Integer16 和 keyPath