Ułatwiam to. Dodaję nowy plik C ++ do mojego projektu Objective C, zmieniam jego nazwę na .mm, a następnie tworzę w nim standardową klasę C ++. Następnie tworzę statyczną metodę klasy w sekcji "public:" dla funkcji C ++, która pobiera NSString i zwraca NSString (lub NSArray, jeśli tego chcesz). Następnie konwertuję NSString na C ++ std :: string w następujący sposób:
// 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;
}
Stamtąd mogę użyć regex_replace w następujący sposób:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Następnie mogę przekonwertować ten std :: string z powrotem na NSString za pomocą:
NSString *sResponse2 = @(sResult.c_str());
Jeśli używasz tego języka C ++ tylko dla tej funkcji, możesz uznać za stosowne wywołanie tego pliku extra.mm (nazwa klasy Extra) i umieszczenie tej statycznej metody klasy w, a następnie dodanie innych statycznych metod klasy, gdy nadejdzie sytuacja gdzie po prostu ma sens robienie tego w C ++, ponieważ w niektórych przypadkach jest to mniej kłopotliwe. (Są przypadki, w których ObjC robi coś z mniejszą liczbą wierszy kodu i niektóre przypadki, w których C ++ robi to z mniejszą liczbą wierszy kodu).
PS Jeszcze innym sposobem jest użycie pliku .mm, ale utworzenie opakowania Objective C wokół użycia std :: string i std :: regex_replace () (lub regex_match ()).