كيف يمكنني منع نفسي من الخطأ استخدام NSNumber المؤشر عندما أريد به intValue?

StackOverflow https://stackoverflow.com/questions/1898091

سؤال

ميزة واحدة من جافا التي أود حقا autoboxing التي المترجم تلقائيا يحول بين الأوليات و فئات المجمع.

أنا أكتب البيانات الأساسية في تطبيق الهدف-C/الكاكاو, و أنا وجدت أنه من المحبط أن تتعامل مع عدد صحيح سمات برمجيا.هنا لماذا:

//img is a managed object that I have fetched

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];  

إذا كنت يحدث أن ينسى intValue الرسالة التي لدى بعض الأحيان ، ثم على الباحث أن يحصل على تمرير stringWithFormat: هو في الواقع قيمة المؤشر.

المشكلة هي أن هذا يحدث تماما بصمت ... لا المترجم خطأ أو تحذير.في بعض الأحيان سوف تنفق وقتا طويلا التصحيح عند هذا سخيف غبي هو المشكلة.

هل هناك طريقة تغيير أسلوب البرمجة أو مترجم إعدادات أن يمنعني من الوقوع في هذا الفخ ؟

تحرير:لم أكن واضحا عن حقيقة أن المثال أعلاه هو مجرد واحدة من العديد من الأماكن التي واجهتني مشكلة.هنا هو آخر مثال افتراضي لا يجب أن نفعل مع السلاسل:

الكيان CollegeClass فقد اثنين من صحيح سمات: courseNumber و enrollmentLimit.دعونا نقول كنت ترغب في مقارنة الأرقام طبعا:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

أو وبالمثل ، لنفترض أنني أريد أن حساب متوسط انتساب الحد لجميع الفئات في قسم CS.

هل كانت مفيدة؟

المحلول

... لنفترض أنني أريد أن حساب متوسط انتساب الحد لجميع الفئات في قسم CS.

هذا من السهل القيام به مع NSArray و NSSet هو @avg المشغل.بالطبع هذا سوف يعود NSNumber الذي يضع لك في مشكلة #2:

دعونا نقول كنت ترغب في مقارنة الأرقام طبعا:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

أعتقد أنك تقصد أن المشكلة هل خطر هو حذف intValue الرسالة مما مقارنة NSNumber الكائن id إلى int.

مترجم يقدم تحذيرا عن مثل هذه المقارنات.في كسكودي, إضافة -Wextra إلى "الآخر" ج "الأعلام" بناء الإعداد.لمزيد من تحذير الخيارات ، انظر قائمة كاملة من دول مجلس التعاون الخليجي تحذيرات.

نصائح أخرى

يمكنك استخدام %@ لتحويل NSNumber مباشرة إلى سلسلة بدلا من %d.

وسوف تتخذ في الواقع أي NSObject على أساس الطبقة وتحويله إلى سلسلة أعتقد.

هذا ينطبق فقط عند التعامل مع البيانات الأساسية, ولكن إذا كنت تستخدم MOGenerator إلى إنشاء فئات الخاصة بك البيانات الأساسية الكائنات (الذي أنصح به على أي حال), ثم يمكنك استخدام -[propertyName]Value طرق الوصول مباشرة إلى القيمة الصحيحة بالنسبة للعقارات التي تعود NSNumbers:

// These two methods are identical when called on a class 
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];

بدوره على "Typecheck المكالمات printf/scanf"تحذير ، إذا لم يكن بالفعل.هذا لا حاليا مساعدة مع NS/CFString التنسيق, ولكن لقد قدم الرادار تعزيز الطلب (x-الرادار://المشكلة/7375186) على ذلك.أنتم مدعوون إلى الملف الخاص بك بالطبع.

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