Converting a std
June 26, 2019
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.