Ich mache es einfach. Ich füge meinem Objective C-Projekt eine neue C ++ - Datei hinzu, benenne sie in .mm um und erstelle dann eine Standard-C ++ - Klasse darin. Dann erstelle ich im Abschnitt "public:" eine statische Klassenmethode für eine C ++ - Funktion, die einen NSString verwendet und einen NSString zurückgibt (oder NSArray, wenn Sie dies wünschen). Ich konvertiere dann NSString in C ++ std :: string wie folgt:
// If anyone knows a more efficient way, let me know in the comments.
// The "if" condition below is because ObjC crashes if converting to
// std::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
std::string sTemp([sInput UTF8String]);
s = sTemp;
}
Von dort aus kann ich regex_replace wie folgt verwenden:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Dann kann ich diesen std :: string wieder in einen NSString konvertieren mit:
NSString *sResponse2 = @(sResult.c_str());
Wenn Sie dieses C ++ nur für diese Funktion verwenden, ist es möglicherweise geeignet, diese Datei extra.mm (Klassenname Extra) aufzurufen, diese statische Klassenmethode einzufügen und dann andere statische Klassenmethoden hinzuzufügen, wenn die Situation eintrifft wo es nur Sinn macht, es in C ++ zu tun, weil es in einigen Fällen weniger mühsam ist. (Es gibt Fälle, in denen ObjC etwas mit weniger Codezeilen ausführt, und einige Fälle, in denen C ++ dies mit weniger Codezeilen tut.)
PS Eine weitere Möglichkeit besteht darin, eine .mm-Datei zu verwenden, aber einen Objective C-Wrapper für die Verwendung von std :: string und std :: regex_replace () (oder regex_match ()) zu erstellen.