2012-05-25 38 views
5

Tôi muốn có thuộc tính Entity trong Dữ liệu chính là số nguyên 64 bit. Vì mô hình sẽ chạy trên iOS và theo như tôi biết các thiết bị này không phải là 64 bit, tôi nhận thấy rằng NSNumber là cách để đi (dữ liệu lõi cung cấp cho bạn tùy chọn đối tượng hoặc thuộc tính vô hướng cho các kiểu nguyên thủy). Tôi giả định rằng NSNumber sẽ nội bộ quản lý việc theo dõi một đại diện phù hợp cho 64 bit. Bây giờ, tôi cần trừ 1 từ thuộc tính "64 bit" này trong thực thể của tôi tại một thời điểm nào đó (trong trường hợp bạn không đoán, thuộc tính 64 bit là tham số max_id trong API Twitter), nhưng phải làm vì vậy, trước tiên tôi cần phải mở hộp số bên trong thuộc tính NSNumber.Làm cách nào để sử dụng dữ liệu lõi của thuộc tính Integer 64?

Vì vậy, tôi có nên nhận được intValue không? longValue? unsignedIntValue? unsignedLongValue? dài dài? cái nào?

Trả lời

7

Vì bạn đã biết loại (64 bit số nguyên), bạn không cần phải kiểm tra cho nó.

Để có được một số nguyên 64 bit ra khỏi một NSNumber, thực hiện một trong các cách sau:

NSInteger myInteger = [myNSNumber integerValue]; 
int64_t myInteger = [myNSNumber integerValue]; 

Để chỉ cần thêm một đến nó, bạn có thể sử dụng một cái gì đó như thế này:

myNSNumber = [NSNumber numberWithInteger:[myNSNumber integerValue]+1]]; 

Lưu ý rằng iOS hiện có các loại dữ liệu 64 bit như int64_tNSInteger.

EDIT:
Nếu lý do duy nhất mà bạn đang sử dụng NSNumber là để lưu trữ các số nguyên 64 bit, bạn chỉ có thể tuyên bố là tài sản như thế này trong mô hình phân lớp của bạn và bỏ qua unboxing/đấm bốc hoàn toàn:

@property (nonatomic) int64_t myIntValue; 

Lưu ý rằng dữ liệu cốt lõi thực hiện điều này theo mặc định nếu bạn chọn Sử dụng thuộc tính vô hướng cho các kiểu dữ liệu nguyên thủy tùy chọn của Tạo NSManagedObject Subclass tính năng.

0

Hãy thử đặt này trong một thể loại NSNumber:

-(int64_t) int64value 
{ 
    if (sizeof(short) == 8) 
     return [self shortValue]; 
    if (sizeof(int) == 8) 
     return [self intValue]; 
    if (sizeof(long) == 8) 
     return [self longValue]; 
    if (sizeof(long long) == 8) 
     return [self longLongValue]; 

    return -1; // or throw an exception 
} 
+0

xin lỗi bạn đang nói rằng không có cách nào để nói định dạng nào tôi sẽ nhận được giá trị ngoài NSNumber theo mặc định? Dường như không có ý nghĩa.Nếu CoreData nói với tôi rằng tôi có thể lưu trữ một số nguyên 64 bit trong một NSNumber, không nên có một cách đơn giản để tôi trừ 1 từ NSNumber đó mà không quan tâm đến cách nó được biểu diễn bên trong? – SaldaVonSchwartz

+0

[myNSNumberObject objCType]; – bbarnhart

+0

myNSManagedObject.myNSNumber.objCType ném EXEC_BAD_ACCESS ... và số được đặt. Tôi có thể nhìn thấy nó trong trình gỡ lỗi và in nó vào giao diện điều khiển. đưa cái gì? – SaldaVonSchwartz

0

Để có được loại C chứa trong NSNumber sử dụng objCType

Ví dụ

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
NSLog(@"%s", [myFloat objCType]); 

Sẽ in "f" vì nó có chứa một giá trị của kiểu float.

Ngoài ra, hãy xem @encode() sẽ trả về ký tự loại C.

Ví dụ

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
if (strcmp(myFloat) == @encode(float)) { 
    NSLog(@"This is a float"); 
} 

Cũng

NSNumber *myFloat = [NSNumber numberWithFloat:5.5f]; 
CFNumberType numberType = CFNumberGetType((CFNumberRef)myFloat); 
+0

@enum? Tôi nghĩ bạn có nghĩa là @encode ... –

+0

Cảm ơn bạn. Sửa lỗi. – bbarnhart

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