Tout d'abord, vous devez utiliser Objective-C++ pour que cela fonctionne le moins du monde ; le moyen le plus simple de s'en assurer est de renommer tous vos fichiers *.m
pour *.mm
C'est de loin la méthode manuelle la plus utilisable (non dépréciée) pour obtenir un code C++. std::string
dans un NSString
est avec :
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Cela fonctionnera dans la plupart des cas - et si vous ne faites pas de détection et de conversion d'encodage spécifiques, UTF-8 vous donnera un bon résultat pour que les caractères non latins " fonctionnent ".
En revanche, si vous réalisez une application plus importante ou si vous n'êtes pas le seul à travailler dessus, vous voudrez probablement quelque chose de plus facile à appliquer.
Adapté de archives de la liste de diffusion cocoa-dev
@interface NSString (cppstring_additions)
+(NSString*) stringWithwstring:(const std::wstring&)string;
+(NSString*) stringWithstring:(const std::string&)string;
-(std::wstring) getwstring;
-(std::string) getstring;
@end
@implementation NSString (cppstring_additions)
#if TARGET_RT_BIG_ENDIAN
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32BE);
#else
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
#endif
+(NSString*) stringWithwstring:(const std::wstring&)ws
{
char* data = (char*)ws.data();
unsigned size = ws.size() * sizeof(wchar_t);
NSString* result = [[NSString alloc] initWithBytes:data length:size encoding:kEncoding_wchar_t];
return result;
}
+(NSString*) stringWithstring:(const std::string&)s
{
NSString* result = [[NSString alloc] initWithUTF8String:s.c_str()];
return result;
}
-(std::wstring) getwstring
{
NSData* asData = [self dataUsingEncoding:kEncoding_wchar_t];
return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
-(std::string) getstring
{
return [self UTF8String];
}
@end
Avec cela en place (et de manière appropriée #import
ed) vous pouvez maintenant :
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Et la même chose pour std::wstring
ce qui est plus que pratique.