سؤال

ما الفرق بين NSNumber و Nsinteger؟ هل هناك أكثر بيئيا مثل هذه التي يجب أن أعرفها؟ هل هناك واحد للطوائف؟

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

المحلول

الإجابات الحالية مفيدة؛ إضافة لهم:

نعم، NSUInteger يعطي ضعف النطاق بين الأعداد الصحيحة الموجبة NSInteger, ، لكنني أعتقد أن سبب حرج آخر لاختيار بين الاثنين هو ببساطة التمييز بين الحالات حيث القيم السلبية ببساطة لا معنى لها.

مثال: قيمة العودة NSArraycount الطريقة هي NSUInteger, وهذا منطقي أنه لا يمكننا أن يكون لدينا مجموعة مع عدد سلبي من العناصر. عندما يعرف المبرمج أنه غير مائعين، لديه / لديها المزيد من حرية إجراء العمليات التي قد تكون غير موثوق بها في القضية الموقع، بما في ذلك عمليات bitwise مثل التحول. هذه المدونة post. يتحدث المزيد عن الموقع مقابل غير موقعة.

تخميني عن CGFloat ضد NSFloat (أي غير موجود): قد يكون الأمر كذلك أن مصممي عناصر التعليمات البرمجية NextStep لم يكن يحتاج ببساطة إلى تحديد عدد كبير من القيم العائمة، خارج الفواصل الزمنية. لذلك أعطوا NSTimeInterval, ، وهو نوع من الفاصلة العائمة، ولكنه مخصص بوضوح للاستخدام مع فترات زمنية. وبصراحة، من الرائع أن يكون هذا النوع لأنك تعرف أنه يعني دائما أن تكون في ثوان دون الحاجة إلى التعامل مع الهيكل. عندما تنتقل إلى عالم الرسومات (حيث تعيش الرسومات الأساسية)، يطفو فجأة من حولك، تحوم في الهواء (هاها). لذلك من المنطقي أن نقدم CGFloat هناك. هذه الفقرة كلها "تكهنات تعليمية".

أيضا، فقط أن تكون واضحا لماذا قد تستخدم NSInteger الخ بدلا من أنواع البدائية: لأن هذه الطريقة أسهل في كتابة التعليمات البرمجية المحمولة التي تستفيد بالكامل من بنية الماكينات. على سبيل المثال، CGFloat يستخدم 32 بت على بعض الآلات و 64 بت على الآخرين، وهذا يتوقف إلى حد كبير على مقدار الفجوة الكفاءة الموجودة على تلك الآلات لتلك الأحجام. في بعض الحالات، ليس هناك تسريع حقيقي لاستخدام 32 بت vs 64 بت، لذلك قد تستخدم 64 بتساء. إذا كنت أعلنت أشياء كما CGFloat"، تحصل فجأة على هذا الدقة الإضافية" مجانا "عند إعادة ترجمة.

وكما أشار IKENNDAC، NSNumber هي فئة مجمع للجميع من هذه (وغيرها من أنواع البدائية أو شبه البدائية مثل BOOL) والتي تمكنك من تضمينها في حياتك NSArrayرمل NSDictionaryS، أرشفة لهم بسهولة أكبر، والقيام بأشياء أخرى NSObjectS يمكن القيام به.

نصائح أخرى

NSNumber هو فئة، ليست بدائية، ويستخدم عند الحاجة إلى وضع أرقام الخام إلى القواميس أو صفائف أو تغليفها بطريقة أخرى. NSInteger, NSUInteger, CGFloat, ، إلخ هي أنواع بسيطة وتتوافق (على أنظمة 32 BT مثل iPhone) int, unsigned int و float.

كقاعدة عامة، إذا كنت بحاجة إلى تخزين رقم في مكان ما، استخدم NSNumber. وبعد إذا كنت تقوم بعمل حسابات، حلقات، إلخ، استخدم NSInteger, NSUInteger أو CGFloat.

يمكنك التفاف NSInteger في an. NSNumber:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... واحصل عليه:

NSInteger anInteger = [aNumber integerValue];

يمكنك معرفة المزيد من المعلومات هنا: http://iosdevelopertips.com/cocoa/nsnumber-and-nsinter.html.

nsinteger هو تماما مثل التقليدية int في C. انها typedef. هناك آخرون مثل NSUInteger, CGFloat, ، إلخ. أن جميعا جميعا مرادفات لأنواع بدائية.

NSNumber مفيد عندما تحتاج إلى التمسك برقم في nsarray أو nsdictionary. الممارسة القياسية هي استخدام هذه المجموعات مقابل الدوران الخاص بك؛ العيب هو أنه لا يمكن أن تحتوي فقط على كائنات موضوعية C.

nsnumber يلف بشكل أساسي int (أو تعويم، إلخ) إلى كائن OBJ-C (على غرار مفهوم C # / Java الخاص ب "الملاكمة" نوع بدائي) يمكن إضافته إلى صفيف:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

لأسباب الأداء، إذا كنت تستطيع، استخدم أنواع البدائية (مثل int، Float، Int []). ومع ذلك، في بعض الأحيان لا يمكنك تجنب NSARRAY / NSNumber، مثل عند قراءة أو كتابة إدخالات إلى .plist ملف.

يستخدم NSNumber عموما لتخزين المتغيرات، يستخدم NSUINTEGER للحساب

يمكنك تغيير NSNumber إلى NSUINTEGER عن طريق القيام بذلك:

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

لقد قيل من قبل ولكن كقاعدة عامة للإبهام، المتغيرات التي يجب تحديدها مع * هي فئات C.، في حين أن المتغيرات التي لا تحتاج إلى أبيئها.

كما قال من قبل الآخرين من قبل، NSNumber هو NSObject فرعية. انها ليست ج c البدائية (مثل int، غير الموقعة، تعويم، مزدوج، إلخ.) NSInteger, CGFloat, NSUInteger هي بسيطة typedefs على جي بيئيين.

الحاجة إلى NSNumber ينشأ من الحاجة إلى استخدام الأرقام كمعلمات إلى واجهات برمجة التطبيقات التي تتطلب الكائنات. مثال، عندما تريد تخزين رقم في NSArray, ، في البيانات الأساسية، أو في NSDictionary.

هل هناك أكثر بيئيا مثل هذه التي يجب أن أعرفها؟ نحن سوف، NSNumber ليس نوعا بدائيا، وينتف على جميع أنواع الأرقام (يطفو، وأنواع متكاملة، ومن المنطمنون وما إلى ذلك). يجب أن تتعلم أيضا عن NSValue، وهي القاعدة NSNumber.

هل هناك واحد للطوائف؟ لا يوجد "NS" typedef for float، ولكن NSNumber يمكن التفاف حول أي رقم تعويم:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

أو يمكنك استخدام CoreGraphics النوع البدائي CGFLoat.

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