NSNumber कैसे बढ़ाएँ


108

मैं NSNumber कैसे बढ़ाऊं?

यानी myNSNumber ++


2
याद रखें: उपयोग करते समय NSNumber *, हमेशा यह देखने के लिए जांचें कि क्या आदिम प्रकार पर्याप्त होगा।
WKS

1
मुझे आश्चर्य है कि ऐसा करने का कोई तेज़ / अनुकूलित तरीका प्रदान करने वाला कोई उत्तर नहीं है, क्योंकि मूल्य बढ़ाने के लिए आपको क्वेरी को संयोजित करने, संयोजित करने और बनाने की आवश्यकता है, इसलिए लूप में ऐसा करने से समय लग सकता है।
पेट्रोव

जवाबों:


123

अपडेट: FYI करें, मैं व्यक्तिगत रूप से बोल्टकॉक और डार्कडस्ट के एक-लाइन के उत्तर को बेहतर तरीके से पसंद करता हूं। वे अधिक संक्षिप्त हैं, और अतिरिक्त चर की आवश्यकता नहीं है।


वेतन वृद्धि के क्रम में NSNumber, आपको इसका मूल्य प्राप्त करना होगा, वेतन वृद्धि, और इसे एक नए स्टोर में करना होगाNSNumber

उदाहरण के लिए, NSNumberएक पूर्णांक रखने के लिए :

NSNumber *number = [NSNumber numberWithInt:...];
int value = [number intValue];
number = [NSNumber numberWithInt:value + 1];

या NSNumberएक फ्लोटिंग-पॉइंट नंबर रखने के लिए:

NSNumber *number = [NSNumber numberWithDouble:...];
double value = [number doubleValue];
number = [NSNumber numberWithDouble:value + 1.0];

62
यह कोर डेटा में NSNumber गुणों से नफरत करने का एक कारण है। NSNumber गणित पर काम करने और प्रदर्शन करने के लिए बहुत असुविधाजनक है।
क्रिश्चियन श्लेन्सकर

फिर से NSNumber ने काम नहीं किया, जबकि शून्य के साथ आरंभिक मूल्य कचरा देते हैं।
जिग्नेश B

क्षमा करें, इसके लिए क्या ...स्टैंड है? एक छद्म कोड संदर्भ सही है? XCode नहीं है...
boulder_ruby

@boulder_ruby ...आपके इच्छित नंबर के लिए एक प्लेसहोल्डर है।
इटाई फेरबर

126

NSNumberवस्तुएं अपरिवर्तनीय हैं; सबसे अच्छा आप जो कर सकते हैं वह है आदिम मूल्य को पकड़ना, इसे बढ़ाना फिर परिणाम को अपनी NSNumberवस्तु में लपेटना :

NSNumber *bNumber = [NSNumber numberWithInt:[aNumber intValue] + 1];

28
आधुनिक भाषाएँ: 1, उद्देश्य-सी: 0.
devios1

77

किसी के लिए जो Xcode के नवीनतम संस्करण का उपयोग कर रहा है (इसे 4.4.1, SDK 5.1 के रूप में लिख रहा है), ऑब्जेक्ट शाब्दिक के उपयोग के साथ, आप कोड को थोड़ा और भी साफ कर सकते हैं ...

NSNumber *x = @(1);
x = @([x intValue] + 1);
// x = 2

अभी भी बॉक्सिंग से निपटने के लिए एक तरह का दर्द और साधारण ऑपरेशन करने के लिए सब कुछ अनबॉक्स करना, लेकिन यह बेहतर हो रहा है, या कम से कम कम हो रहा है।


6
@softRli अधिक ObjC साहित्य देखने के लिए clang.llvm.org/docs/ObjectiveCLiterals.html देखें! बहुत काम imo।
chown

1
और उस मामले के लिए आप x - @ (x.intValue + 1) का उपयोग कर सकते हैं, हालांकि कई लोग गैर-संपत्ति विधियों को लागू करने के लिए डॉट नोटेशन का उपयोग करना पसंद नहीं करते हैं। यह छोटा है, लेकिन इसे डॉट नोटेशन का दुरुपयोग कहा जा सकता है।
डंकन सी

@boulder_ruby, यह पुनर्मूल्यांकन है। एनएसएन्यूट्स अपरिवर्तनीय हैं, इसलिए मूल्य में "वृद्धि" करने के लिए, आपको वास्तव में इसे नए मूल्य पर पुन: असाइन करना होगा।
शॉर्टस्टफसुशी

30

NSNumbers अपरिवर्तनीय हैं, आपको एक नया उदाहरण बनाना होगा।

// Work with 64 bit to support very large values
myNSNumber = [NSNumber numberWithLongLong:[myNSNumber longLongValue] + 1];

// EDIT: With modern syntax:
myNSNumber = @([myNSNumber longLongValue] + 1);

24

उन सभी को एक साथ रखो, और आपके पास है:

myNSNumber = @(myNSNumber.intValue + 1);

आप यहाँ myNSNumber के मूल्य को पुन: असाइन नहीं कर रहे हैं? मैंने सोचा था कि NSNumberवस्तुओं को अपरिवर्तनीय (?)
boulder_ruby

1
आप एक नया NSNumber ऑब्जेक्ट बना रहे हैं। myNSNumber एक पॉइंटर (NSNumber *) है, और आपके द्वारा किए जाने पर एक नया मान होता है।
JLundell

3

मुझे डॉट अभिव्यक्ति पसंद है क्योंकि यह अधिक संक्षिप्त है और यही कारण है कि IOS इसे पहली जगह में समर्थन करता है:

myNSNumber = [NSNumber numberWithInt:myNSNumber.intValue + 1];

डॉट नोटेशन वह नहीं है जो आप सोचते हैं, और कई बार धीमा हो सकता है (यह "valueForKey:" के लिए डिफ़ॉल्ट हो सकता है यदि "संपत्ति" के लिए कोई संश्लेषित एक्सेसर मौजूद नहीं है (आपके मामले में intValue में) मौजूद है। intravue को @property के रूप में कभी भी परिभाषित नहीं किया गया था। NSNumber की।
मोटी श्नोर

2

यदि आप इसका उपयोग अभिन्न मूल्य को संग्रहीत करने के लिए कर रहे हैं:

myNSNumber = @(myNSNumber.longLongValue + 1);

फ़्लोटिंग पॉइंट सामान के लिए संक्षिप्त उत्तर निम्नलिखित है, लेकिन ऐसा करने के लिए एक बुरा विचार है, आप सटीक ढीले होंगे और यदि आप बाद में किसी भी तरह की तुलना कर रहे हैं जैसे [myNSNumber isEqual: @ (4.5)] तो आप आश्चर्यचकित हो सकते हैं :

myNSNumber = @(myNSNumber.floatValue + 1);

यदि आपको ऑब्जेक्ट-सी में ऑब्जेक्ट के रूप में दर्शाने वाले फ्लोटिंग पॉइंट नंबरों पर गणित करने की आवश्यकता है (यानी यदि आपको उन्हें सरणियों, शब्दकोशों, आदि में डालने की आवश्यकता है) तो आपको उपयोग करना चाहिए NSDecimalNumber


यदि आप नीचे जा रहे हैं, तो रचनात्मक हो सकता है और कह सकते हैं कि क्यों।
LMS

आपके उत्तर का अर्थ है कि यह NSNumber है जो गोलाई के कामों का परिचय देता है। यह सही नहीं है, NSNumber में स्केलर प्रकारों के समान व्यवहार होता है। इसके अलावा NSDecimalNumbers का उपयोग करने की आपकी सलाह काफी परेशान करने वाली है। वहाँ आप का मतलब है कि उन आवश्यक हैं यदि आप onmbjective-c में पहले नागरिक वस्तुओं की आवश्यकता है। लेकिन निश्चित रूप से वस्तुओं पर nsnumbers भी। NSDecimalNumbers की एक उच्च परिशुद्धता है, लेकिन उनके साथ गोलाई त्रुटि भी हो सकती है। और: सेशन को बढ़ाने के बारे में पूछता है, फ्लोट और डबल अंकगणित के साथ आपका जवाब। लेकिन उनके पास कोई वेतन वृद्धि नहीं है, क्योंकि उनके पास कोई प्राकृतिक सक्सेसर नहीं है।
vikingosegundo

@vikingosegundo यह एक NSNumber को एक फ्लोट में परिवर्तित कर रहा है, जो सटीकता की हानि का कारण बनता है क्योंकि NSNumber स्टोर संख्‍याओं में समान रूप से जहां फ़्लोट base2 होते हैं, इसलिए यह NSNumber की गलती नहीं है, बल्कि इसके पीछे और पीछे रूपांतरण है। और NSDecimalNumbers जाएगा नहीं कारण गणित Base10 के लिए गोलाई त्रुटियों, और वे कर रहे हैं अंकगणित के लिए बनाया गया, दस्तावेज़ पढ़ें। ओपी ने एक NSNumber को बढ़ाने के बारे में पूछा, और मैंने उसे अभिन्न मामले के लिए एक सही और पठनीय जवाब दिया, और फ्लोटिंग पॉइंट केस के लिए एक जवाब भी दिया, लेकिन इसके खिलाफ सलाह दी और फिर बेहतर सुझाव के साथ पालन किया।
LMS

एक उदाहरण किसी भी संख्या का प्रतिनिधित्व कर सकता है जिसे mantissa x 10 घातांक के रूप में व्यक्त किया जा सकता है जहां mantissa 38 अंकों तक एक दशमलव पूर्णांक है, और घातांक -128 और 127 के बीच पूर्णांक है। प्रत्येक संख्या को इस तरह व्यक्त नहीं किया जा सकता है। साथ ही ओपी ने आसान वेतन वृद्धि के लिए कहा। NSDecimalNumber प्रदान नहीं करता है। और फिर भी आपका उत्तर बताता है कि आपको ऑब्जेक्ट स्पेस में NSDecimalNumbers की आवश्यकता है। यह गलत है।
वाइकिंगोजगुंडो

यार मैं अपने जवाब के साथ वास्तव में मददगार बनने की कोशिश कर रहा था, और सोचा कि नीचे की वजह से मैं कुछ गलत हो गया और मुझे लगा कि मैं कुछ नया सीख सकता हूं। मैं देख सकता हूं कि अब ऐसा नहीं है। आपकी टिप्पणियों का कोई मतलब नहीं है और मेरा सुझाव है कि आपके पास नंबर सिस्टम पर एक रीड यूओ है क्योंकि आधार 10 नंबर sys है। (पुन: आपकी बोली) आधार 10 अंकों के लिए किसी भी गोल त्रुटियों का कारण नहीं होगा, मैंने कहा कि सटीक, सिर्फ सटीकता के बारे में कुछ भी नहीं है, लेकिन 128 दशमलव में भी बहुत सटीक है।
LMS

0

भविष्य के उपयोग को आसान बनाने के लिए एक श्रेणी का उपयोग करें। यहाँ एक मूल विचार है।

 - (void)incrementIntBy:(int)ammount {
      self = [NSNumber numberWithInt:(self.intValue + ammount)];
 }

ओह। एक श्रेणी जो एक आवृत्ति विधि को लागू करती है जो स्वयं को बदल देती है?!? यह गंभीर रूप से बुरा है। क्यों नहीं एक उदाहरण विधि लिखें जिसके परिणामस्वरूप NSNumber की गैर-शून्य वापसी हो।
डंकन सी

NSNumber को अपरिवर्तनीय के रूप में परिभाषित किया गया है, इसलिए यह श्रेणी विधि इसकी कथित अपरिवर्तनीयता का उल्लंघन कर रही है (भले ही स्वयं की जगह)। एक बेहतर डिज़ाइन की गई श्रेणी इस तरह NSNumber के रूप में एक नया इनिशियलाइज़र जोड़ेगी, इस रूप में: + numberByIncrementingAmounf: (int) राशि;
मोटी श्नोर

0

इस सवाल के जवाब में अच्छी जानकारी के बहुत सारे। मैंने अपने कोड में चयनित उत्तर का उपयोग किया और यह काम किया। फिर मैंने बाकी पोस्टों को पढ़ना शुरू किया और कोड को बहुत सरल कर दिया। यह पढ़ना थोड़ा कठिन है कि क्या आप एक्सकोड 5 में पेश किए गए नोटेशन के परिवर्तनों से परिचित नहीं हैं, लेकिन यह बहुत साफ है। मैं शायद इसे सिर्फ एक लाइन बना सकता था, लेकिन फिर यह पता लगाना थोड़ा मुश्किल है कि मैं क्या कर रहा हूं।

मैं एक NSNumber को डिक्शनरी में स्टोर कर रहा हूं और मैं इसे बढ़ाना चाहता हूं। मैं इसे प्राप्त करता हूं, इसे एक इंट में परिवर्तित करता हूं, इसे एनएसएनम्बर में परिवर्तित करते हुए इसे बढ़ाता हूं, फिर इसे शब्दकोश में डालता हूं।

पुराना कोड

 NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
 int correctValue = [correct intValue];
 correct = [NSNumber numberWithInt:correctValue + 1];
 [scoringDictionary removeObjectForKey:@"correct"];
 scoringDictionary[@"correct"] = correct;

नया कोड

NSNumber *correct = [scoringDictionary objectForKey:@"correct"];
scoringDictionary[@"correct"] = @(correct.intValue + 1);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.