Я полегшу. Я додаю новий файл C ++ до свого проекту Objective C, перейменую його як .mm, а потім створюю всередині стандартний клас C ++. Потім я роблю метод статичного класу в розділі "public:" для функції C ++, який приймає NSString і повертає NSString (або NSArray, якщо це те, що ти хочеш). Потім я конвертую NSString в C ++ std :: string так:
// 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;
}
Звідти я можу використовувати regex_replace так:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Тоді я можу перетворити ту строку std :: назад у NSString за допомогою:
NSString *sResponse2 = @(sResult.c_str());
Якщо ви використовуєте цей C ++ лише для цієї функції, то, можливо, вам буде доречно викликати цей файл extra.mm (ім'я класу Extra) та ввести цей метод статичного класу, а потім додати інші методи статичного класу, коли ситуація настане де це просто має сенс робити це на C ++, оскільки в деяких випадках це менше клопоту. (Бувають випадки, коли ObjC робить щось із меншим рядком коду, і деякі випадки, коли C ++ робить це з меншими рядками коду.)
PS Ще одним іншим способом для цього є використання .mm-файлу, але зробити обертку Objective C навколо використання std :: string та std :: regex_replace () (або regex_match ()).