2014-06-22 15 views
9

Tôi có thuộc tính CoreData trên một thực thể mà trên đó tôi muốn lưu trữ các giá trị số nguyên lớn hơn Int32.maxUInt32.max. Giá trị được sử dụng làm chỉ mục, do đó, hiệu suất tra cứu quan trọng. Vì vậy, tôi đã chọn sử dụng Integer 64 làm kiểu dữ liệu trong CoreData.Làm thế nào để sử dụng Core Data Integer 64 với Swift Int64?

Bây giờ tôi đang đấu tranh về cách lưu trữ Int64 trên cá thể thực thể của tôi. Xem thêm các phương pháp tiếp cận khác nhau mà tôi đã thử.

Sử dụng NSNumber:

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : NSNumber 
} 

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

Sử dụng NSInteger:

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : NSInteger 
} 

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

Sử dụng Int64:

import Foundation 
import CoreData 

class Node : NSManagedObject { 
    @NSManaged var id : Int64 
} 

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

Làm thế nào các thuộc tính cần được xác định/giao để sử dụng số nguyên 64 bit?

Trả lời

21

Bạn có thể xác định "Integer 64" thuộc tính như NSNumber trong phân lớp đối tượng quản lý:

@NSManaged var id : NSNumber 

Việc đặt giá trị:

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

Lấy giá trị:

let value:Int64 = node.id.longLongValue 

Lưu ý rằng long long là số nguyên 64 bit trên cả 32 bit và 64 bit kiến trúc bit.


Xác định tài sản như

@NSManaged var id : Int64 

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

nên cũng làm việc, bởi vì Core Data hỗ trợ phương pháp accessor vô hướng cho nguyên thủy kiểu dữ liệu. Ngoại lệ EXC_BAD_ACCESS khi ấn định giá trị cho tôi như một lỗi trong trình biên dịch Swift hoặc thời gian chạy. Một vấn đề tương tự cho một tài sản Boolean được báo cáo ở đây

hợp tài sản NSNumber được báo cáo để làm việc, nhưng vô hướng Bool tài sản gây ra ngoại lệ tương tự.

+0

Sử dụng giải pháp được đề xuất của bạn 'NSNumber (longLong: value)' đã hoạt động. Tôi đồng ý với bạn rằng sau này có thể là một lỗi trong Swift. – bouke

+1

Vấn đề với Int64 gây ra bẫy trên kiến ​​trúc 32 bit (18113807) đã được sửa trong Xcode 6.1 beta. – bouke

Các vấn đề liên quan