2009-08-27 12 views
37

को NSInteger चर पासिंग क्यों इस काम नहीं करता है:NSMutableDictionary या NSMutableArray

NSInteger temp = 20; 
[userSettingsFromFile setObject:temp forKey:@"aTemp"]; 

लेकिन यह करता है:

[userSettingsFromFile setObject:@"someObject" forKey:@"aTemp"]; 

मैं NSInteger चर का उपयोग कैसे कर सकते हैं?

+0

आपका शीर्षक सही नहीं है - अपने नमूना कोड के अनुसार, आप एक NSMutableDictionary, नहीं एक NSMutableArray का उपयोग कर रहे हैं। –

+0

मैंने शीर्षक संपादित किया है। वैसे भी, समस्या एनएसएमयूटेबलएरे के साथ और सामान्य रूप से किसी भी संग्रह के साथ उत्पन्न हो सकती है। – mouviciel

उत्तर

90

NSInteger कोई ऑब्जेक्ट नहीं है - यह केवल 64-बिट पर 32-बिट या long पर int पर टाइपकास्ट है। चूंकि NSDictionary केवल ऑब्जेक्ट्स स्टोर कर सकता है, इसलिए आप इसे स्टोर करने से पहले किसी ऑब्जेक्ट में पूर्णांक को लपेटने की आवश्यकता है। इस प्रयास करें:

NSInteger temp = 20; 
[userSettingsFromFile setObject:[NSNumber numberWithInteger:temp] 
         forKey:@"aTemp"]; 
+2

इसे NSDictionay से वापस लाने के लिए आपको NSInteger temp = [[userSettingsFromFile objectForKey: @ "aTemp"] integerValue] जैसे कुछ उपयोग करने की आवश्यकता है; – JScarry

2

तुम जो भी setObject के माध्यम से पारित NSObject से प्राप्त किया जाना है। NSInteger नहीं है, यह एक साधारण int typedef है। आपके दूसरे उदाहरण में आप NSString का उपयोग करते हैं, जो NSObject से लिया गया है।

5

संग्रह में संख्याओं को संग्रहीत करने के लिए, आपको उन्हें NSNumber उदाहरण में लपेटना होगा।

double aDouble = 20.3d; 
NSInteger anInt = 20; 

NSNumber *aWrappedDouble = [NSNumber numberWithDouble:aDouble]; 
NSNumber *aWrappedInt = [NSNumber numberWithInteger:anInt]; 

NSArray *anArray = [NSArray arrayWithObjects:aWrappedDouble, aWrappedInt, nil]; 
0

सुधार: जो कुछ भी setObject: के माध्यम से पारित कर दिया है NSObject वर्ग से प्राप्त किया जा की जरूरत नहीं है, लेकिन यह NSObject प्रोटोकॉल, कि retain और release को परिभाषित करता है के अनुरूप होना चाहिए।

यह भ्रमित हो सकता है, लेकिन कक्षाओं और प्रोटोकॉल में अलग-अलग नाम रिक्त स्थान हैं। और NSObject नामक एक वर्ग और प्रोटोकॉल दोनों है, कक्षा NSObject प्रोटोकॉल NSObject के अनुरूप है। एक और रूट वर्ग है, NSProxy कक्षा जो NSObject प्रोटोकॉल के अनुरूप भी है।

यह महत्वपूर्ण है, क्योंकि अन्यथा प्रॉक्सी का उपयोग संग्रह और ऑटो रिलीज पूल में नहीं किया जा सकता है, जबकि अभी भी हल्के प्रॉक्सी रूट वर्ग हैं।

0

लंबे integer.What के लिए पर्याय इस प्रकार NSInteger है कैसे NSInteger परिभाषित किया जाता है:

#if __LP64__ || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
typedef unsigned long NSUInteger; 
#else 
typedef int NSInteger; 
typedef unsigned int NSUInteger; 
#endif 

NSNumber एक ऑब्जेक्टिव-सी वर्ग, NSValue का एक उपवर्ग विशिष्ट होना है। आप किसी हस्ताक्षरित या हस्ताक्षरित चार, लघु int, int, long int, long int int, float, double या bool

प्राथमिक भेदों में से एक है कि आप संग्रह में NSNumber का उपयोग कर सकते हैं जैसे कि NSNumber ऑब्जेक्ट बना सकते हैं, जैसे कि NSArray, जहां एक वस्तु की आवश्यकता है। उदाहरण के लिए, यदि आप एक NSArray में एक नाव जोड़ने की जरूरत है, तो आप पहले नाव से एक NSNumber ऑब्जेक्ट बनाने के लिए की आवश्यकता होगी:

float percentage = 40.5; 

... // NSNumber वस्तु है, जो अब में डाला जा सकता बनाएं एक NSArray

NSNumber *percentageObject = [NSNumber numberWithFloat:percentage]; 
0

बस का उपयोग करें: $(variable) वाक्य रचना कन्वर्ट करने के लिए आदिम प्रकार आपत्ति उठाने का।

0

@ मैट बॉल के उत्तर के लिए संदर्भित: एनएसआईएनटेगर एक वस्तु नहीं है - यह केवल 64-बिट पर 32-बिट या लंबे समय तक int टाइप करने के लिए टाइपकास्ट है।चूंकि NSDictionary केवल ऑब्जेक्ट्स स्टोर कर सकता है, इसलिए आप इसे स्टोर करने से पहले किसी ऑब्जेक्ट में पूर्णांक को लपेटने की आवश्यकता है।

तो, स्विफ्ट के मामले में, यह तुम कैसे करते है:

let temp:NSInteger = yourInteger.hashValue 
संबंधित मुद्दे