Hallo, ich versuche, einen Standard std::string
In einen NSString
umzuwandeln, aber ich habe nicht viel Glück.
Ich kann erfolgreich von einem NSString
zu einem std::string
Mit dem folgenden Code konvertieren
NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];
Ich erhalte jedoch einen Kompilierungsfehler, wenn ich Folgendes versuche
NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];
Der Fehler, den ich erhalte, ist
Cannot convert 'std::string' to 'const char*' in argument passing
Vermisse ich hier etwas?
Danke im Voraus.
Holen Sie sich c-string aus std :: string für die Konvertierung:
NSString *errorMessage = [NSString stringWithCString:REALM.c_str()
encoding:[NSString defaultCStringEncoding]];
Erstens müssen Sie Objective-C++ verwenden, damit dies im geringsten funktioniert. Am einfachsten stellen Sie sicher, dass alle Ihre *.m
- Dateien in *.mm
umbenannt werden.
Die bei weitem am besten verwendbare (nicht veraltete) manuelle Methode, um ein C++ std::string
In ein NSString
zu bekommen, ist mit:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Dies funktioniert in den meisten Fällen - und wenn Sie keine spezifische Kodierungserkennung und -konvertierung durchführen, liefert UTF-8 ein gutes Ergebnis, wenn nicht-lateinische Zeichen einfach funktionieren.
Wenn Sie eine größere App erstellen oder nicht die einzige sind, die daran arbeitet, möchten Sie wahrscheinlich etwas, das einfacher anzuwenden ist.
Angepasst aus Kakao-Entwickler-Mailinglisten-Archive
@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
Mit dieser Funktion (und entsprechend #import
) Können Sie jetzt:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Und das Gleiche gilt für std::wstring
, Was mehr als praktisch ist.
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
Apple hat jetzt eine neue Möglichkeit, diese Konvertierung durchzuführen. In XCode7 habe ich die Option Bearbeiten> Konvertieren> In moderne Objective C-Syntax ... verwendet, um dies herauszufinden. Es wird ein @ -Symbol verwendet.
std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
Ich habe auch festgestellt, dass:
NSString *nsString = [NSString stringWithFormat:@"%s",standardString];
Funktioniert wie ein Champion.
Hier ist das Code-Snippet/Beispiel:
string str_simple = "HELLO WORLD";
//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
encoding:[NSString defaultCStringEncoding]];
NSLog(stringinObjC);