5

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

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

那么我应该得到 intValue 吗?长值?无符号整数值?无符号长值?长长?哪一个?

4

3 回答 3

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;

Note that core data does this by default if you select the Use scalar properties for primitive data types option of the Create NSManagedObject Subclass feature.

于 2012-05-26T00:05:27.657 回答
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
}
于 2012-05-25T23:33:17.473 回答
0

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

例子

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

将打印“f”,因为它包含一个浮点类型的值。

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

例子

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);
于 2012-05-25T23:58:12.653 回答