दो NSNumber ऑब्जेक्ट कैसे जोड़ें?


79

अब यह आसान होना चाहिए, लेकिन योग दो कैसे हो सकता है NSNumber? की तरह है कि:

[one floatValue] + [two floatValue]

या एक बेहतर तरीका मौजूद है?

जवाबों:


143

वास्तव में एक बेहतर तरीका नहीं है, लेकिन आपको वास्तव में ऐसा नहीं करना चाहिए अगर आप इसे टाल सकते हैं। NSNumberस्केलर संख्या के लिए एक आवरण के रूप में मौजूद है ताकि आप उन्हें संग्रह में संग्रहीत कर सकें और उन्हें अन्य के साथ बहुरूपिक रूप से पास कर सकें NSObjects। वे वास्तव में वास्तविक गणित में संख्याओं को संग्रहीत करने के लिए उपयोग नहीं किए जाते हैं। यदि आप उन पर गणित करते हैं, तो यह केवल स्केलर पर ऑपरेशन करने की तुलना में बहुत धीमा है, जो शायद इसलिए इसके लिए कोई सुविधा विधियां नहीं हैं।

उदाहरण के लिए:

NSNumber *sum = [NSNumber numberWithFloat:([one floatValue] + [two floatValue])];

संदेश प्रेषण पर न्यूनतम 21 निर्देशों पर उड़ रहा है, और हालांकि गणित के 1 निर्देश को करने के लिए विधियों को अनबॉक्स करने के लिए और (शायद कुछ सौ) बॉक्स को रीबॉक्स करने के लिए बहुत सारे कोड हैं।

तो अगर आपको dicts में नंबरों को स्टोर करने की आवश्यकता है a NSNumber, यदि आपको किसी ऐसी चीज़ को पास करने की ज़रूरत है जो किसी फ़ंक्शन का उपयोग करने वाली संख्या या स्ट्रिंग हो सकती है NSNumber, लेकिन यदि आप स्केलर सी प्रकार के साथ गणित स्टिक करना चाहते हैं।


1
मुझे लगता है कि अगर आपको संख्याओं के संग्रह को संग्रहीत करने की आवश्यकता है, जिसके लिए आप बहुत अधिक गणित करने का इरादा रखते हैं - शायद आप वास्तव में उचित संख्यात्मक प्रकार की सी शैली सरणी चाहते हैं?
केंडल हेल्मसटेटर गेलनर

जब भी आप बहुत सारे गणित कर रहे होते हैं तो आप स्केलर्स का उपयोग करना चाहते हैं, आप उन वस्तुओं का उपयोग करना चाहते हैं जब आपको बहुरूपता की आवश्यकता होती है या उन्हें मौजूदा कंटेनरों में फिट होने की आवश्यकता होती है।
लुई गेरबारग

NSNumber पर उचित विधि 'नंबरविथफ्लोट:' है - शायद यह उत्तर देने के समय से बदल गया है।
निक

आप सही हैं, गेटर फ्लोटवैल्यू है, इसलिए मैं आदतन इसे दोनों जगहों पर टाइप करता हूं, लेकिन स्टैकओवरफ्लो मुझे एक संकलन त्रुटि नहीं देता है। निश्चित
लुई गेरबारग

2
@clopez: "डॉक्टर, ऐसा करने पर मुझे दर्द होता है।" NSNumber कंटेनरों के साथ उपयोग करने के लिए एक बॉक्सिंग प्रकार है, अंकगणित के लिए नहीं। यदि आप अंकगणित कर रहे हैं, तो एक अंकगणितीय प्रकार का उपयोग करें।
स्टीफन कैनन

49

NSDecimalNumber ( NSNumber के उपवर्ग ) में वे सभी उपहार हैं जिनकी आप तलाश कर रहे हैं:

– decimalNumberByAdding:
– decimalNumberBySubtracting:
– decimalNumberByMultiplyingBy:
– decimalNumberByDividingBy:
– decimalNumberByRaisingToPower:

...

यदि कंप्यूटिंग प्रदर्शन रुचि का है, तो C ++ सरणी std :: वेक्टर या जैसे कन्वर्ट करें।

अब मैं कभी भी C-Arrays का उपयोग नहीं करता; गलत इंडेक्स या पॉइंटर का उपयोग करके क्रैश करना बहुत आसान है। और हर नए [] को हटाने के लिए [] के साथ बहुत थकाऊ।


क्या आप इस बात पर विस्तार से बता सकते हैं कि "हर नए [] को हटाने के साथ बहुत ही थकाऊ []?"
jpswain

इसे इस तरह रख कर देखते हैं। सी में, सूचक का उपयोग करने से बचें। ऑब्जेक्टिव-सी का पूरा बिंदु C के ऊपर एक लेयर लगा रहा है जिसके बारे में आपको कभी चिंता नहीं करनी है। सी सीधे इस्तेमाल की जाने वाली भाषा नहीं है। यह कुछ ऐसा है जिसे पहले "प्रबंधित" करने की आवश्यकता है।
user4951

दो NSDecimalNumberएस जोड़ने के बाद , NSDecimalNumberपरिणाम को वापस कैसे कन्वर्ट करें NSNumber? (यह सवाल दो NSNumberएस को जोड़ने के बारे में है, दो एस को जोड़ने के बारे में नहीं है NSDecimalNumber।)
ओहो

जब आपके पास कभी भी सदिश मार्ग हो तो आप सी सरणी का उपयोग क्यों करेंगे?
जेक लांग

1
आप NSDecimalNumber को NSNumber में क्यों बदलना चाहते हैं? एक NSDecimalNumber है : एक NSNumber@interface NSDecimalNumber : NSNumber
स्टीवन फिशर

12

आप उपयोग कर सकते हैं

NSNumber *sum = @([first integerValue] + [second integerValue]);

संपादित करें: जैसा कि ओहो ने देखा है , यह उदाहरण NSNumberपूर्णांक मान रखने वाले दो उदाहरणों को जोड़ने के लिए है। यदि आप NSNumberफ़्लोटिंग-पॉइंट मानों को जोड़ना चाहते हैं, तो आपको निम्न कार्य करने चाहिए:

NSNumber *sum = @([first floatValue] + [second floatValue]);

"@" प्रतीक का कारण क्या है? मुझे यकीन नहीं है कि मैं समझता हूं कि इस संदर्भ में यह क्या करता है।
माइक मेयर्स

आह। मैं अब देखता हूं .... यह एक NSNumber शाब्दिक है, जैसा कि यहां वर्णित है: stackoverflow.com/a/11120371/35723
माइक मेयर्स

हाँ, @mikemeyers यह शाब्दिक है कि जैसे wraps पुरातन intया longया यह बड़ा भाई है typedef'एड NSIntegerमें NSNumber वस्तुओं
नेमसिस

integerValueकाट-छाँट करता है float। इस जवाब को कैसे वोट दिया जा सकता है?
ओहो

@ यह एक सरल उदाहरण था। integerValueयदि आप संख्याओं के दशमलव भाग को संरक्षित करना चाहते हैं तो दुनिया में आप क्यों उपयोग करेंगे ?
नेमसिस

6

वर्तमान शीर्ष मतदान का जवाब फ़्लोट्स के उपयोग के कारण मुश्किल से निदान कीड़े और सटीक नुकसान के लिए जा रहा है। यदि आप NSNumber मानों पर संख्या संचालन कर रहे हैं, तो आपको पहले NSDecimalNumber में कनवर्ट करना चाहिए और इसके बजाय उन ऑब्जेक्ट्स के साथ संचालन करना चाहिए।

से प्रलेखन :

NSDecimalNumber, NSNumber का एक अपरिवर्तनीय उपवर्ग, बेस -10 अंकगणित करने के लिए एक वस्तु-उन्मुख आवरण प्रदान करता है। एक उदाहरण किसी भी संख्या का प्रतिनिधित्व कर सकता है जिसे mantissa x 10 ^ घातांक के रूप में व्यक्त किया जा सकता है जहां mantissa 38 अंकों तक लंबा एक दशमलव पूर्णांक है, और घातांक 127 के माध्यम से -128 से पूर्णांक है।

इसलिए, आपको अपने NSNumber उदाहरणों को NSDecimalNumbers के रूप में परिवर्तित करना चाहिए, आप [NSNumber decimalValue]जो भी अंकगणित करना चाहते हैं, उसे करें, फिर जब आप कर लें तो NSNumber पर वापस असाइन करें।

उद्देश्य-सी में:

NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithDecimal:one.decimalValue]
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithDecimal:two.decimalValue]
NSNumber *result = [a decimalNumberByAdding:b]

स्विफ्ट 3 में:

let a = NSDecimalNumber(decimal: one.decimalValue)
let b = NSDecimalNumber(decimal: two.decimalValue)
let result: NSNumber = a.adding(b)

0

उपयोग क्यों नहीं NSxEpression?

NSNumber *x = @(4.5), *y = @(-2);

NSExpression *ex = [NSExpression expressionWithFormat:@"(%@ + %@)", x, y];
NSNumber *result = [ex expressionValueWithObject:nil context:nil];

NSLog(@"%@",result); // will print out "2.5"

आप एक NSExpression का निर्माण भी कर सकते हैं जिसका पुन: उपयोग विभिन्न तर्कों के साथ किया जा सकता है, जैसे:

NSExpression *expr = [NSExpression expressionWithFormat: @"(X+Y)"];
NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", y, @"Y", nil];
NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);

उदाहरण के लिए, हम समान पार्स की गई अभिव्यक्ति का मूल्यांकन कर सकते हैं, हर बार एक अलग "Y" मान के साथ:

 for (float f=20; f<30; f+=2.0) {
    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:x, @"X", @(f), @"Y", nil];
    NSLog(@"%@", [expr expressionValueWithObject:parameters context:nil]);
 }

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.