NSArray和 Vector<struct>互轉

最近寫程序的時候遇到這樣的問題,需要將Vector裏頭的struct轉存到NSArray裏頭。
一般遇到這種問題,常見處理是再定義一個class,然後把struct裏頭的內容一一搬過來,然後放到NSArray裏頭。這個做法雖然麻煩,但是安全,不會引起其他的問題。
我不想再重新定義一個class,再爲他初始化,寫屬性,轉存的時候一一賦值,因爲實在太麻煩了,我想直接用他的struct定義。所以,我通過NSValue來做這件事情。

C類型和NSValue之間的轉換

#define MyGetNSValueFromCType(cValue) ([NSValue value:&cValue withObjCType:@encode(typeof(cValue))])
#define MySetCValueFromNSValue(ocValue, cValue) [ocValue getValue:&cValue]

使用方法如下:
int count = 10;
NSValue *value = MyGetNSValueFromCType(count);
int newCount;
MySetCValueFromNSValue(value, newCount);

Vector和NSArray之間的轉化
#define MyGetArrayFromVector(vec) ({\
NSMutableArray *arr = [NSMutableArray array];\
for(int i = 0; i < vec.size(); i++)\
{\
NSValue *value = MyGetNSValueFromCType(vec[i]);\
if (value != nil)\
[arr addObject:value];\
}\
[arr count] == 0 ? nil : arr;\
})

#define MySetVectorFromArray(vec, type, arr) {\
for(int i = 0; i < [arr count]; i++)\
{\
type _value;\
MySetCValueFromNSValue([arr objectAtIndex:i], _value);\
vec.push_back(_value);\
}\
}

使用方法:
struct hello
{
int a;
int b;
};

vector<hello> aVector;
hello a;
a.a = 10;
a.b = 100;

hello b;
b.a = 20;
b.b = 200;

aVector.push_back(a);
aVector.push_back(b);
NSArray *myArr = NdGetArrayFromVector(aVector);

vector<hello> bVector;
NdSetVectorFromArray(bVector, hello, myArr);

注意:
這裏的struct裏頭的成員類型只能是C語言的基礎類型,不能是string,vector這些C++的類!因爲它們不是簡單的內存塊,轉換後的 NSValue很容易出現依賴於原對象的內存的狀況。(如果您僅在當前函數內使用轉換後的對象,倒是沒有問題的,但是這種需求應該不會出現吧^_^)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章