के लिए वेक्टर वहाँ एक अच्छा तरीका NSNumber
के NSArray
करने के लिए एक vector<int32_t>
कन्वर्ट करने के लिए है या पाशन और एक NSMutableArray
काफी एक ही रास्ता करने के लिए जोड़ रहा है?परिवर्तित एसटीडी: NSArray
उत्तर
आप वस्तुओं की एक वेक्टर है, तो आप क्या कर सकते हैं निम्नलिखित:
NSArray *myArray = [NSArray arrayWithObjects:&vector[0] count:vector.size()];
हालांकि, अपने वेक्टर आदिम प्रकार, इस तरह के NSInteger
, int
, float
, आदि के रूप में, आप के लिए होता है करने के लिए होता है, तो मैन्युअल रूप से वेक्टर में मानों को लूप करें और उन्हें पहले NSNumber
में परिवर्तित करें।
वेक्टर की वस्तुओं के जीवनकाल के संबंध में इस दृष्टिकोण से बहुत सावधान रहें! – Richard
यह मेरे प्रश्न का उत्तर देता है। मेरे पास 'वेक्टर
यह मेरे लिए काम नहीं करता है। मुझे "टाइप प्रकार के पैरामीटर को शुरू नहीं किया जा सकता है 'const __unsafe_unretained id *' प्रकार के रावल्यू के साथ ..." –
हाँ, आप बना सकते हैं निम्नलिखित दृष्टिकोण का उपयोग करके किसी NSInteger
की NSArray
एक std::vector<NSInteger>
से रों:
// thrown together as a quick demo. this could be improved.
NSArray * NSIntegerVectorToNSArrayOfNSIntegers(const std::vector<NSInteger>& vec) {
struct MONCallback {
static const void* retain(CFAllocatorRef allocator, const void* value) {
/* nothing to do */
return value;
}
static void release(CFAllocatorRef allocator, const void* value) {
/* nothing to do */
}
static CFStringRef copyDescription(const void* value) {
const NSInteger i(*(NSInteger*)&value);
return CFStringCreateWithFormat(0, 0, CFSTR("MON - %d"), i);
}
static Boolean equal(const void* value1, const void* value2) {
const NSInteger a(*(NSInteger*)&value1);
const NSInteger b(*(NSInteger*)&value2);
return a == b;
}
};
const CFArrayCallBacks callbacks = {
.version = 0,
.retain = MONCallback::retain,
.release = MONCallback::release,
.copyDescription = MONCallback::copyDescription,
.equal = MONCallback::equal
};
const void** p((const void**)&vec.front());
NSArray * result((NSArray*)CFArrayCreate(0, p, vec.size(), &callbacks));
return [result autorelease];
}
void vec_demo() {
static_assert(sizeof(NSInteger) == sizeof(NSInteger*), "you can only use pointer-sized values in a CFArray");
std::vector<NSInteger> vec;
for (NSInteger i(0); i < 117; ++i) {
vec.push_back(i);
}
CFShow(NSIntegerVectorToNSArrayOfNSIntegers(vec));
}
हालांकि, अगर आप इस संग्रह के आपके उपयोग के संबंध बहुत सावधान होने की आवश्यकता होगी। फाउंडेशन उम्मीद करता है कि तत्व NSObject
एस हो। यदि आप इसे बाहरी एपीआई में पास करते हैं जो NSObject
एस की सरणी की अपेक्षा करता है, तो यह संभवतः एक त्रुटि का कारण बन जाएगा (EXC_BAD_ACCESS
objc_msgSend
में)।
आमतौर पर, कोई उन्हें NSNumber
में परिवर्तित कर देगा। मैं अपने प्रोग्राम में केवल NSArray
NSInteger
एस का उपयोग करूंगा, केवल एक और एपीआई आवश्यक (ऐप्पल के पास कुछ हैं) - वे सिर्फ एक साथ बहुत अच्छी तरह से खेल नहीं सकते हैं।
मैं वास्तव में 'NSNumber' का मतलब था लेकिन एक आकर्षक जवाब के लिए +1! – mydogisbox
- 1. CFArrayRef से NSArray को कैसे परिवर्तित करें?
- 2. NSArray
- 3. NSArray
- 4. nsarray
- 5. nsarray
- 6. NSArray
- 7. NSArray
- 8. NSArray
- 9. सरणी - NSArray
- 10. __NSArrayI और __NSArrayM क्या है? NSArray में कैसे परिवर्तित करें?
- 11. NSArray को NSString में परिवर्तित करने के लिए कैसे करें
- 12. NSArray को NSDictionary
- 13. Convert वस्तु एसटीडी ::
- 14. क्रमबद्ध NSArray
- 15. क्रैश NSArray
- 16. एक NSArray
- 17. std :: प्रतिलिपि एसटीडी :: एसटीडी के लिए अदालत :: जोड़ी
- 18. एसटीडी का प्रारंभ :: सरणी
- 19. एसटीडी :: स्ट्रिंग कन्स्ट्रक्टर
- 20. एसटीडी का हिस्सा :: टपल
- 21. कॉन्स्ट-शुद्धता एसटीडी कंटेनर
- 22. चाल अर्थ विज्ञान एसटीडी
- 23. क्रमबद्ध NSArray तरह
- 24. NSArray तत्व जोड़ने
- 25. NSArray initWithObjects: लोड नहीं
- 26. अलग NSArray वस्तुओं
- 27. NSArray और NSString
- 28. JSON से NSArray
- 29. खोजें NSArray NSDictionaries
- 30. कुंजी मान एक NSArray
एनएसएआरएआरई में आदिम प्रकार एनएसआईएनटेगर के तत्व नहीं हो सकते हैं। –
@ रिचर्ड जे। रौसीआईआई वास्तव में, यह * कर सकते हैं *। मैंने वास्तव में यह मेरे जवाब में दिखाया है। – justin