2012-04-18 18 views
17

vector<int32_t>NSArrayNSNumberに変換するか、またはループしてNSMutableArrayに追加するとよいでしょうか?をNSArrayに変換する

+0

NSArrayには、プリミティブ型NSIntegerの要素を含めることはできません。 –

+1

@ RichardJ.RossIII実際、それはできます。私は私の答えでこれを正確に実証しました。 – justin

答えて

13

あなたがオブジェクトのベクトルを持っている場合は、次の操作を実行できます

NSArray *myArray = [NSArray arrayWithObjects:&vector[0] count:vector.size()]; 

しかし、あなたのベクトルは、プリミティブ型、などNSIntegerintfloat、として、あなたが持っているでしょうにが含まれている場合は、手動でベクトル内の値をループし、最初にNSNumberに変換します。

+0

ベクトルのオブジェクトの存続期間に関してこのアプローチには非常に注意してください! – Richard

+0

これは私の質問に答える。私は 'ベクトル'を持っています。残念ながら、私はすべての値をループしなければなりません。 – mydogisbox

+1

これは私のためには機能しません。私は "型のパラメータを初期化することはできません 'const __unsafe_unretained id *' rvalue型..." –

5

はい、あなたは次のアプローチを使用してstd::vector<NSInteger>からNSArrayNSIntegerのSを作成することができます。

// 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の配列を必要とする外部APIに渡すと、おそらくエラーが発生します(EXC_BAD_ACCESSobjc_msgSend)。

通常、それらはNSNumberに変換されます。私はこのアプリケーションをのNSArrayと私のプログラムで別の別のAPIが(Appleがいくつかあります)必要とする場合にのみ使用します。

+3

私は実際には「NSNumber」を意味しましたが、魅力的な答えは+1です! – mydogisbox

関連する問題