Tôi làm cho nó dễ dàng. Tôi thêm một tệp C ++ mới vào dự án Objective C của mình, đổi tên nó thành .mm, sau đó tạo một lớp C ++ tiêu chuẩn bên trong. Sau đó, tôi tạo một phương thức lớp tĩnh trong phần "công khai:" cho hàm C ++ có NSString và trả về NSString (hoặc NSArray, nếu đó là điều bạn muốn). Sau đó tôi chuyển đổi NSString sang C ++ std :: string như vậy:
// 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;
}
Từ đó, tôi có thể sử dụng regex numplace như vậy:
// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);
Sau đó, tôi có thể chuyển chuỗi std :: đó thành NSString với:
NSString *sResponse2 = @(sResult.c_str());
Nếu bạn chỉ sử dụng C ++ này cho chức năng này, thì bạn có thể thấy nó phù hợp để gọi tệp này thêm.mm (tên lớp Extra) và đặt phương thức lớp tĩnh này vào, sau đó thêm các phương thức lớp tĩnh khác khi tình huống đến trong đó có ý nghĩa để làm điều đó trong C ++ vì nó ít rắc rối hơn trong một số trường hợp. (Có những trường hợp ObjC làm một cái gì đó với ít dòng mã hơn và một số trường hợp C ++ thực hiện nó với ít dòng mã hơn.)
PS Vẫn còn một cách khác với điều này là sử dụng tệp .mm nhưng tạo một trình bao bọc Objective C xung quanh việc sử dụng std :: string và std :: regex numplace () (hoặc regex_match ()).