如何使用核心数据Integer 64属性?

时间:2012-05-25 23:22:28

标签: ios cocoa-touch core-data properties nsnumber

我希望Core Data中的Entity属性是64位整数。由于该模型将在iOS上运行,据我所知这些设备不是64位,我认为NSNumber是可行的方法(核心数据为您提供了对象或标量属性选项)原始类型)。 我假设NSNumber将在内部负责跟踪64位的合适表示。

现在,我需要在某个时刻从我的实体中的这个“64位”属性中减去1(如果您没猜到,64位属性是Twitter API中的max_id参数),但是这样做,我首先需要取消NSNumber属性中的数字。

我应该得到intValue吗?的longValue? unsignedIntValue? unsignedLongValue?好久不见?哪一个?

3 个答案:

答案 0 :(得分:8)

由于您已经知道了类型(64位整数),因此无需检查它。

要从NSNumber中获取64位整数,请执行以下操作之一:

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

为了只添加一个,你可以使用这样的东西:

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

请注意,iOS 具有64位数据类型,例如int64_tNSInteger

修改
如果您使用NSNumber的唯一原因是存储64位整数,您可以在模型子类中声明这样的属性并完全跳过取消装箱/装箱:

@property (nonatomic) int64_t myIntValue;

请注意,如果您选择创建NSManagedObject子类功能的使用基本数据类型的标量属性选项,核心数据会默认执行此操作。

答案 1 :(得分:0)

尝试将其放入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
}

答案 2 :(得分:0)

要获取NSNumber中包含的C类型,请使用objCType

实施例

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

将打印" f"因为它包含float类型的值。

另外,请查看@encode(),它将返回一个C类型字符。

实施例

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

另外

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