【问题标题】:How to use Core Data Integer 64 with Swift Int64?如何在 Swift Int64 中使用 Core Data Integer 64?
【发布时间】: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 位整数?

【问题讨论】:

    标签: core-data swift ios8


    【解决方案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 编译器或运行时中的错误。布尔属性的类似问题 在这里报道

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

    【讨论】:

    • 使用您建议的解决方法NSNumber(longLong: value) 有效。我同意你的观点,后者可能是 Swift 中的一个错误。
    • Int64 在 32 位架构 (18113807) 上导致陷阱的问题已在 Xcode 6.1 beta 中得到修复。
    • 你认为它在 xcode 6.1 beta 中修复了吗?我在 xcode 11.2.1 中仍然面临这个问题
    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多