5

最初に、私の無知を告白します。プロジェクトに取り組んできた数か月で、Objective-C について知っていることはすべて学びました。また、Objective-C が、私が扱った他の言語では単純な問題を複雑にしているように見えることにも、まったくもどかしい思いをしています。この質問は適切なケースです...

最初の実行で、アプリは一連の JSON をダウンロードし、それを使用して CoreData ストアを作成します。Obj-C/JSON ライブラリ (CJSONDeserializer) を使用して、JSON を NSArray に変換します。1 つの CoreData エンティティの JSON ダウンロードには、別のエンティティの関連フィールドを識別する番号 ( ) を含むフィールドがあり、それ以外"show_id":2の場合は null ( "show_id":null) を含むフィールドがあります。そのフィールドを処理する際に、次を使用してそれを NSNumber に割り当てます...

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

次に、関連するレコードがない場合に無駄な処理を行わないように、関連するレコードを取得してリンクする前に、有効な番号があることを確認しようとします。

尋問shoIndex中...

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

与える...

shoIndex: 19590600, <null>, <null>

JSON 値はnull&...

shoIndex: 228300880, 51, 51

それ以外は。

これまでのところ、私が行った唯一の成功したチェックは...

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

誰かがより良い方法を提案できますか?

アップデート...

別の見方をすると、値を含むことがあるshoIndexとして割り当てられます。Obj-C には、の内容の型を確認するために使用できる演算子のようなものがありますか?NSNumberNSString@"<null>"isashoIndex

TIA、ペドロ。

4

3 に答える 3

11

[shoObject class]オブジェクトのクラスを取得するために使用します。shoObjectしたがって、のクラスをテストするには、

[shoObject isKindOfClass:[NSString class]];

空の文字列またはNSNumberを定義するマーカーを整理したら、マクロを作成できます。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.hをインポートした後、次のような関数を呼び出すことができます。

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

これでこの問題が解決され、コードからわかるように、文字列や配列などでも機能します。Wil Shipleyに感謝します!

于 2010-11-20T05:11:30.607 に答える
-1

Objective-cでは、そうでnilはありませんnull。それで:

if (shotIndex != nil) {
   // its not nil
}
于 2010-11-20T05:06:43.730 に答える