2010-11-20 8 views
5

まず、私の無知を告白します。私はプロジェクトで取り組んできた数カ月間、私がObjective-Cについて知っていることをすべて学びました。 Objective-Cが、他のどの言語でも単純な問題を複雑にしているように見えるのは、私が完全にイライラしています。この質問は事実です...NSNumberのヌル値を確認する方法

最初の実行で、私のアプリケーションは、CoreDataストアにデータを取り込むために使用するJSONの束をダウンロードします。私はObj-C/JSONライブラリ(CJSONDeserializer)を使ってJSONをNSArraysに変換します。 1つのCoreDataエンティティのJSONダウンロードには、別のエンティティに関連フィールドがある場合はそれを識別する番号("show_id":2)を含むフィールドがあり、そうでない場合はnull("show_id":null)があります。私は...

NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"]; 

を使用するNSNumberに割り当て、そのフィールドを処理する際に、私はその後、私はどこそこに無駄な処理をしないように&リンクに関連したレコードを取得しようとする前に、有効な番号を持っていることを確認してみてください関連するレコードはありません。

shoIndex: 228300880, 51, 51 

別段JSON値がnull &た

shoIndex: 19590600, <null>, <null> 

...と...

NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]); 

が与えるshoIndexに問い合わせます。私が作った

これまでのところ唯一成功したチェックは、誰もがより良い方法を提案することができます

if (![[shoIndex description] isEqualToString:@"<null>"]) { 

...とありますか?それを別の方法shoIndexを探し

更新...

は時々NSString@"<null>"が含まれていNSNumberとして割り当てられています。 Obj-Cにの内容のタイプをチェックするために使用できるisa演算子のようなものがありますか?

TIA、Pedro。

+0

を理解していないためのNSNumberが最初に発生しているのチェック? – jlehr

答えて

10

オブジェクトのクラスを取得するには、[shoObject class]を使用します。そう、shoObjectのクラスをテストするために、あなたはマーカーが空の文字列またはのNSNumberを定義するものを整理したら、マクロを作成することができます

[shoObject isKindOfClass:[NSString class]]; 

を使用します。私はCommonMacros.hと呼ばれるファイルにIsEmptyマクロを保存することでこれを行います。コードは次のとおりです。

//Thanks Wil 
//http://wilshipley.com/blog/2005/10/pimp-my-code-interlude-free-code.html 

static inline BOOL IsEmpty(id thing) { 
    return thing == nil 
    || ([thing isEqual:[NSNull null]]) //JS addition for coredata 
    || ([thing respondsToSelector:@selector(length)] 
     && [(NSData *)thing length] == 0) 
    || ([thing respondsToSelector:@selector(count)] 
     && [(NSArray *)thing count] == 0); 
} 

次に、CommonMacrosをインポートした後です。時間、あなたはこのように関数を呼び出すことができます。

if (IsEmpty(shotIndex)) { 
    //do stuff 
} 

これは、この問題の世話をする必要があり、あなたがコードから見ることができるようにも、文字列、配列などに取り組みます。 Wil Shipleyに感謝します!

+0

ありがとうウィル、それは治療を働く。あなたがそこに与えたURLを見て、私はあなたがすでに他の方法で私を助けてくれたと思っています:) – Pedro

+0

私はあまりにも早く話しました。 shoIndexが空でないので、私は試してみました!IsEmpty(shoIndex)とNSNumberはまっすぐ飛んでいます。 – Pedro

+0

うーん、奇妙な、それはあまりにも悪いです。これをisEqualToStringに追加することをお勧めします:@ "" IsEmptyコードをテストしますが、もちろんそのルートを辿るのは、あなたが最初にこの質問をした理由です。 –

-1

Objective-cでは、nilではなく、nullです。したがって:

if (shotIndex != nil) { 
    // its not nil 
} 
+2

これはまさに私が最初に試したもので、うまくいきませんでした。あなたが私の質問でを見るところでは、それはNSLogがJSON項目がnullだったNSNumberに与えるものです。 – Pedro

+0

これはJSONです。 shotIndexがJSONデータに存在しない場合は、nilになります。しかし、Pedro氏が述べたように、shotIndexはnullの値を持ち、JSONパーサーは[NSNull null]の値を返します。ほとんどのメッセージを[NSNull null]に送信するとクラッシュするので、これは重要な違いです。 – gnasher729

0

NSUserDefaultsのキーがないなど、場合によっては空の文字列としてリテラルを返します。

NSNumberの安全な点検はこちらです。

注それはするNSNumberはあなたがオブジェクトは `NSNumber`のインスタンスであることを考えさせる何isEqualToString

 id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"]; // don't assume is created so don't type as NSNumber* 
     if (![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) { 
関連する問題