سؤال

وأنا تحليل ملف JSON.

وبعد الحصول على NSDictionary، I تحليل الكائنات في القاموس إلى مجموعة من الكائنات. ومع ذلك، لبعض الملفات JSON، وأحصل على NULL، الذي ينبغي أن يكون على ما يرام، لكنه تعطل بلدي التطبيق لأولئك المكان الذي أتوقع شيئا ولكن الحصول على باطل:

- (id)initWithDictionary:(NSDictionary *)boxDictionary {
 if ([self init]) {
  // ... 
  int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
  int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue];
        // ..
 }
 return self;
}
هل كانت مفيدة؟

المحلول

والمشكلة الأساسية ويبدو أن عدم وجود طريقة intValue على NSNull أنك الحصول على العودة من الدعوة إلى valueForKey:.

هل يمكن إضافة طريقة intValue، ولكن ما يمكن أن يكون عليه العودة لNSNull؟ 0؟ -1؟

ورمز لتفعل ذلك سوف ننظر بشيء من هذا القبيل.

في MyNullExtensions.h:

@interface NSNull (integer)
-(int) intValue;
@end

وفي MyNullExtensions.m:

#import "MyNullExtensions.h"

@implementation NSNull (functional)
-(int) intValue
{
    return -1;
}
@end

وفي وقت لاحق، بليك.

نصائح أخرى

لا يمكن int ان nil، لذلك intValue لم يقم بأي شكل من الأشكال أن أقول لكم أنه لا يمكن الحصول على intValue لكائن nil. تحتاج إلى التحقق من الطقس حصلت كائن عاد من valueForKey: قبل أن تسأل عن intValue لها.

if ([boxDictionary valueForKey:@"box_count"])
    numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];

ولا مجرد اختبار بسيط ضد NSNull قبل الاتصال intValue. لا حاجة لتوسيع الكائن NSNull.

if ([rate valueForKey:@"value"]!=[NSNull alloc]) {

    // put your code here

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top