2012-05-25 5 views
5

コアデータのエンティティプロパティを64ビット整数にしたいと考えています。モデルはiOS上で実行される予定であり、これらのデバイスが64ビットではないことが分かっている限り、私はNSNumberが道筋だったと考えました(コアデータはプリミティブ型のオブジェクトまたはスカラープロパティのオプションを提供します)。 NSNumberは64ビットの適切な表現を内部的に把握していると仮定しています。コアデータInteger64プロパティを使用するにはどうすればよいですか?

ここで、私のエンティティのこの「64ビット」プロパティから1ポイントを減算する必要があります(64ビットプロパティはTwitter APIのmax_idパラメータです)。だから、まずNSNumberプロパティの中の番号をunboxする必要があります。

intValueを取得する必要がありますか? longValue? unsignedIntValue? unsignedLongValue?長い間?どれ?

答えて

7

すでにタイプ(64ビット整数)を知っているので、あなたはそれをチェックする必要はありません。

次のいずれかを実行し、するNSNumberのうちの64ビット整数を取得するには:

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

ちょうどそれに1を追加するために、あなたはこのようなものを使用することができます

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

iOS は、int64_tNSIntegerのような64ビットのデータ型を持っています。はありません。

EDIT:
あなたがNSNumberを使用している唯一の理由は、64ビット整数を格納することであるならば、あなたは自分のモデルのサブクラスでこのようにプロパティを宣言し、完全にアンボクシング/ボクシングをスキップすることができます。

あなたが のプリミティブデータ型オプションの 使用スカラプロパティを選択した場合にコアデータはデフォルトでこれを行いますことを
@property (nonatomic) int64_t myIntValue; 

注NSManagedObjectのサブクラスに機能を作成します。

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 
} 
+0

あなたはデフォルトでNSNumberから値を取得する必要がある形式を教える方法がないと言っていますか?意味がないようです。CoreDataがNSNumberに64ビットの整数を格納できると言っている場合、内部的にどのように表現されているか気にせずにそのNSNumberから1を減算する簡単な方法はありませんか? – SaldaVonSchwartz

+0

[myNSNumberObject objCType]; – bbarnhart

+0

myNSManagedObject.myNSNumber.objCTypeはEXEC_BAD_ACCESS ...をスローし、番号が設定されます。私はデバッガでそれを見ることができ、それをコンソールに出力することができます。何を与える? – SaldaVonSchwartz

0

がobjCType

例を使用するNSNumberに含まれるCタイプを取得するには

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); 
+0

@enum?私はあなたが@encodeを意味したと思う... –

+0

ありがとう。修正しました。 – bbarnhart

関連する問題