103

こんにちは私は標準std::stringをに変換しようとしNSStringていますが、あまり運がありません。

次のコードでNSStringaからaに正常に変換できます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

ここで何かが足りませんか?

前もって感謝します。

4

6 に答える 6

118

変換のためにstd::stringからc-stringを取得します:

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];
于 2010-08-23T22:33:07.917 に答える
55

まず、これを少しでも機能させるには、Objective-C++を使用する必要があります。それを確実にする最も簡単な方法は、すべての*.mファイルの名前を次のように変更することです*.mm

std::stringC ++をに導入するための最も使いやすい(非推奨ではない)手動の方法NSStringは、次のとおりです。

std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];

これはほとんどの場合に機能します。特定のエンコーディングの検出と変換を行っていない場合、UTF-8は、ラテン文字以外の文字を「正しく機能させる」ための良い結果をもたらします。

ただし、より大きなアプリを作成している場合、またはアプリに取り組んでいるのはあなただけではない場合は、おそらく、より簡単に適用できるものが必要になります。

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

そのインプレース(および適切に#import編集)を使用すると、次のことが可能になります。

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];

そして、同じことがstd::wstring、便利以上のものです。

于 2011-09-15T01:36:28.000 に答える
25
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
于 2013-12-03T22:27:28.437 に答える
17

Appleは今、あなたにこの変換をしてほしいという新しい方法を持っています。XCode7では、[編集]>[変換]>[モダンObjectiveC構文...]オプションを使用してこれを見つけました。省略形の@記号を使用します。

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
于 2016-02-03T20:03:57.257 に答える
4

私はまたそれを見つけました:

NSString *nsString = [NSString stringWithFormat:@"%s",standardString];

チャンピオンのように機能します。

于 2012-01-11T22:05:33.087 に答える
4

コードスニペット/例は次のとおりです。

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
于 2016-08-13T06:53:10.597 に答える