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

15

我在一个实体上有一个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个回答

27

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

@NSManaged var id : NSNumber

设置一个值:

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

获取值:

let value:Int64 = node.id.longLongValue

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


将该属性定义为

@NSManaged var id : Int64

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

should也能工作,因为Core Data支持原始数据类型的标量访问器方法。当赋值时出现EXC_BAD_ACCESS异常时,这看起来像是Swift编译器或运行时中的一个错误。在这里报告了一个布尔属性的类似问题

其中报告说NSNumber属性可以工作,但标量Bool属性会导致相同的异常。


使用你提出的解决方法 NSNumber(longLong: value) 能够起作用。我同意你的观点,后者很可能是 Swift 中的一个错误。 - Bouke
1
Int64在32位架构上引起陷阱的问题(18113807)已在Xcode 6.1 beta中得到解决。 - Bouke
你认为在Xcode 6.1 beta中已经修复了这个问题吗?我在Xcode 11.2.1中仍然遇到了这个问题。 - user3575114

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接