こんにちは、標準のstd::string
をNSString
に変換しようとしていますが、あまり運がありません。
次のコードでNSString
からstd::string
に正常に変換できます
NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];
ただし、次のことをしようとするとコンパイル時エラーが発生します
NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];
私が得るエラーは
Cannot convert 'std::string' to 'const char*' in argument passing
ここに何かが足りませんか?
前もって感謝します。
変換のためにstd :: stringからc-stringを取得します。
NSString *errorMessage = [NSString stringWithCString:REALM.c_str()
encoding:[NSString defaultCStringEncoding]];
まず、これを少しでも動作させるにはObjective-C++を使用する必要があります。すべての*.m
ファイルの名前を*.mm
に変更することを保証する最も簡単な方法
C++ std::string
をNSString
に入れる最も使いやすい(非推奨ではない)手動の方法は次のとおりです。
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
これはほとんどの場合に機能します。特定のエンコードの検出と変換を行わない場合、UTF-8は非ラテン文字を「正常に動作させる」ために良い結果をもたらします。
ただし、より大きなアプリを作成している場合、または自分で作業しているのは自分だけではない場合は、適用しやすいものが必要になるでしょう。
@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
インプレース(および適切に#import
ed)すると、次のことが可能になります。
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
std::wstring
も同じです。これは便利です。
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
アップルは、この変換を行う新しい方法を提供しています。 XCode7では、これを見つけるために、[編集]> [変換]> [モダンオブジェクティブC構文...]オプションを使用しました。省略形の@記号を使用します。
std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
私もそれを見つけました:
NSString *nsString = [NSString stringWithFormat:@"%s",standardString];
チャンピオンのように機能します。
コードスニペット/例は次のとおりです。
string str_simple = "HELLO WORLD";
//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
encoding:[NSString defaultCStringEncoding]];
NSLog(stringinObjC);