Skip to main content

Converting a std::vector into an NSArray

An excellent piece of code to do the above is here:

//clang++ -std=c++11 -stdlib=libc++ -framework Foundation nsarray.mm -o nsarray
/* Note:
 * - libstdc++ has been frozen by Apple at a pre-C++11 version, so you must opt
     for the newer, BSD-licensed libc++
 * - Apple clang 4.0 (based on LLVM 3.1svn) does not default to C++11 yet, so
     you must explicitly specify this language standard. */
/* @file nsarray.mm
 * @author Jeremy W. Sherman
 *
 * Demonstrates three different approaches to converting a std::vector
 * into an NSArray. */
#import 
#include 
#include 
#include 

int
main(void)
{
 @autoreleasepool {
 /* initializer list */
 std::vector strings = {"a", "b", "c"};

 /* uniform initialization */
 //std::vector strings{"a", "b", "c"};

 /* Exploiting Clang's block->lambda bridging. */
 id nsstrings = [NSMutableArray new];
 std::for_each(strings.begin(), strings.end(), ^(std::string str) {
  id nsstr = [NSString stringWithUTF8String:str.c_str()];
  [nsstrings addObject:nsstr];
 });
 NSLog(@"nsstrings: %@", nsstrings);

 /* Using a lambda directly. */
 [nsstrings removeAllObjects];
 std::for_each(strings.begin(), strings.end(),
  [&nsstrings](std::string str) {
   id nsstr = [NSString stringWithUTF8String:str.c_str()];
   [nsstrings addObject:nsstr];
  });
 NSLog(@"nsstrings: %@", nsstrings);

 /* Now with a range-based for loop. */
 [nsstrings removeAllObjects];
 for (auto str : strings) {
  id nsstr = [NSString stringWithUTF8String:str.c_str()];
  [nsstrings addObject:nsstr];
 }
 NSLog(@"nsstrings: %@", nsstrings);
 return 0;
 }
}
Again, thanks to this gist.

Comments