Czy istnieje dobry sposób przekonwertować vector<int32_t>
na NSArray
z NSNumber
lub jest w pętli i dodanie do NSMutableArray
tylko w ten sposób?przekonwertować std: wektor NSArray
Odpowiedz
Jeśli masz wektor obiektów, można wykonać następujące czynności:
NSArray *myArray = [NSArray arrayWithObjects:&vector[0] count:vector.size()];
Jednakże, jeśli wektor zawiera pierwotne typy, takie jak NSInteger
, int
, float
itp, trzeba by ręcznie zapętlić wartości w wektorze i przekonwertować je najpierw na NSNumber
.
Zachowaj ostrożność stosując to podejście w odniesieniu do czasu życia obiektów wektorowych! – Richard
To odpowiada na moje pytanie. Mam 'vector
To nie działa dla mnie. Otrzymuję komunikat "Nie można zainicjować parametru typu" const __unsafe_unretained id * "z wartością r type ..." –
Tak, może Załóż NSArray
z NSInteger
sz a std::vector<NSInteger>
stosując następujące metody:
// 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));
}
Jednak trzeba być bardzo ostrożnym dotyczące korzystania z tej kolekcji. Fundacja spodziewa się, że elementy będą NSObject
s. Jeśli przekażesz go do zewnętrznego interfejsu API, który oczekuje tablicy NSObject
s, prawdopodobnie spowoduje to błąd (przeczytaj: EXC_BAD_ACCESS
w objc_msgSend
).
Zazwyczaj można je przekonwertować na NSNumber
. Chciałbym użyć tego NSArray
z NSInteger
s w moim programie tylko jeśli inny inny API potrzebował (Apple ma kilka) - Po prostu nie grają bardzo dobrze razem.
Właściwie miałem na myśli 'NSNumber', ale +1 dla fascynującej odpowiedzi! – mydogisbox
- 1. Jak przekonwertować wektor wiersza na wektor kolumny w Eigen?
- 2. wektor std :: podaje
- 3. Inicjujący Eigen :: wektor z std :: wektor
- 4. Jak przekonwertować NSArray do NSMutableArray
- 5. Jak przekonwertować NSArray na NSData?
- 6. std :: wektor :: emplace_back i std :: move
- 7. std :: wektor szybciej niż std :: unordered_set?
- 8. std :: wektor <std::string> crash
- 9. C++ std :: wektor niezależnych std :: thread
- 10. std :: wektor, wątek bezpieczeństwa, wielowątkowość
- 11. Jak zmniejszyć rozmiar std :: wektor?
- 12. std :: wektor :: przypisz odpowiednik QVector
- 13. Konwertuj std :: wektor na tablicę
- 14. Jak przekonwertować ciąg JSON na NSArray?
- 15. C++ std :: transformuj wektor par-> pierwszy na nowy wektor
- 16. znaleźć w std :: wektor <std::pair>
- 17. Kopiowanie std :: wektor: preferowanie przypisania lub std :: copy?
- 18. Przekształć wektor int na wektor str
- 19. std :: wektor <bool> implementacja optymalizacji
- 20. std :: unordered_map wektor indeksu poza zakresem
- 21. Skąd wektor std :: vector przydziela jego pamięć?
- 22. Indeksowanie std :: wektor z ujemnym indeksem
- 23. Zwracanie C++ std :: wektor bez kopii?
- 24. Wektor std :: funkcja z różnymi sygnaturami
- 25. std wektor C++ - głęboka lub płytka kopia
- 26. Testuj zmiennoprzecinkowe std :: wektor z C++ Catch
- 27. konwersja System :: array na std :: wektor
- 28. C++ 11 std :: wektor w środowisku współbieżnym
- 29. std :: wektor jako argument funkcji szablonu
- 30. Stosując (matematycznej) Wektor w std :: map
NSArray nie może zawierać elementów typu NSInteger typu pierwotnego. –
@ RichardJ.RossIII faktycznie, to * może *. Pokazałem dokładnie to w mojej odpowiedzi. – justin