¿Hay una buena forma de convertir un vector<int32_t>
en un NSArray
de NSNumber
o está creando un bucle y agregando un NSMutableArray
prácticamente de la única manera?convert std: vector to NSArray
Respuesta
Si usted tiene un vector de objetos, puede hacer lo siguiente:
NSArray *myArray = [NSArray arrayWithObjects:&vector[0] count:vector.size()];
Sin embargo, si el vector contiene los tipos primitivos, tales como NSInteger
, int
, float
, etc., que tendría que manualmente bucle los valores en el vector y convertirlos primero a NSNumber
.
¡Tenga mucho cuidado con este enfoque con respecto a la vida útil de los objetos del vector! – Richard
Esto responde mi pregunta. Tengo un 'vector
Esto no funciona para mí. Me aparece "No se puede inicializar un parámetro de tipo 'const __unsafe_unretained id *' con un valor de rvalue de tipo ..." –
Sí, se puede crear un NSArray
de NSInteger
s de un std::vector<NSInteger>
utilizando el siguiente enfoque:
// 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));
}
Sin embargo, tendrá que ser muy cautelosos con respecto a su uso de esta colección. Foundation espera que los elementos sean NSObject
s. Si lo pasa a una API externa que espera una matriz de NSObject
s, probablemente causará un error (léase: EXC_BAD_ACCESS
en objc_msgSend
).
Normalmente, uno los convertiría a NSNumber
. Yo usaría este NSArray
de NSInteger
s en mi programa solo si otro API necesitaba (Apple tiene algunos) - Simplemente no juegan muy bien juntos.
En realidad, quería decir 'NSNumber' pero +1 ¡para obtener una respuesta fascinante! – mydogisbox
- 1. convert System :: array to std :: vector
- 2. C++ .NET convert System :: String to std :: string
- 3. std :: vector to boost :: python :: list
- 4. convert vector a la lista
- 5. Java Convert MouseEvent to ActionEvent
- 6. C# convert system.IO.Stream to Byte []
- 7. Ruby Convert String to File
- 8. LINQ Convert Dictionary to Lookup
- 9. NSArray to C array
- 10. Convert SQL para LINQ to SQL
- 11. convert & lt to <xml document
- 12. C++ std :: transform vector of pairs-> first to new vector
- 13. ¿Puede un std :: vector ser = 'd a otro std :: vector?
- 14. Cómo exportar std :: vector
- 15. sizeof() std :: vector (C++)
- 16. std :: vector insert() reasignación
- 17. std :: vector de funciones
- 18. Iterar std :: vector múltiple
- 19. std :: vector <std::string> crash
- 20. std :: list vs std :: vector iteration
- 21. std :: vector y std :: comportamiento min
- 22. C++ std :: pair, std :: vector y memcopy
- 23. std :: vector de std :: vectores de contigüidad
- 24. std :: merge fusionando dos std :: vector coredump
- 25. std :: vector versus std :: array en C++
- 26. std :: vector redimensionar hacia abajo
- 27. const unsigned char * to std :: string
- 28. Convertir std :: vector en matriz
- 29. Regreso std :: vector por valor
- 30. paso eficiente de std :: vector
NSArray no puede contener elementos del tipo primitivo NSInteger. –
@ RichardJ.RossIII en realidad, es * puede *. He demostrado exactamente esto en mi respuesta. – justin