Respostas:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);
Edit: Depois de alguns anos, deixe-me expandir esta resposta. Como corretamente apontado, você provavelmente desejará usar cStringUsingEncoding:comNSASCIIStringEncoding se for acabar usando std::string. Você pode usar UTF-8 com normal std::strings, mas lembre-se de que eles operam em bytes e não em caracteres ou mesmo grafemas. Para um bom "começo", verifique esta pergunta e sua resposta .
Observe também que, se você tem uma string que não pode ser representada como ASCII, mas ainda quer em um std::stringe não quer caracteres não ASCII lá, você pode usar dataUsingEncoding:allowLossyConversion:para obter uma NSDatarepresentação da string com ASCII codificado com perdas conteúdo e, em seguida, jogue-o em seustd::string
-cStringUsingEncoding:lugar. :)
newsão desaprovados e um std::shared_ptrou std::unique_ptrdeve ser preferido.
Conforme observado em philjordan.eu , também pode ser que o NSString esteja nil. Nesse caso, o elenco deve ser feito assim:
// NOTA: se foo for nulo, isso produzirá uma string C ++ vazia
// em vez de remover a referência do ponteiro NULL de UTF8String.
Isso levaria você a essa conversão:
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);