Я встраиваю движок C ++ в проект ObjC iOS, используя .mm (ObjC ++).
// consumer.m
Wrapper* wrapper = ...;
[wrapper setupWithTarget: self
selector: @selector(gotData:)];
-(void) gotData: (int) k {...}
//wrapper.mm
@interface Wrapper() { id targ; SEL sel; } @end
:
-(void) setupWithTarget: T
selector: S] {
targ = T;
sel = S;
cppEngine = new cppEngine(); // i.e. C++ code
cppEngine.addCallback(
[](int data) {
std::cout << "got" << data;
[targ sel: data];
}
);
}
то есть мы настраиваем cppEngine
дать ему обратный вызов; здесь C ++ лямбда.
Когда механизм запускает обратный вызов, мы должны передать данные обратно потребителю.
Мой вопрос: какова правильная архитектура для этого? Я не думаю [targ sel: data];
Действительна Цель С. И даже если бы это было, я не уверен SEL
собирается сделать это через захват лямбды. Это даже действительный объект C ++?
Я могу видеть способ сделать это, батут от статического метода в wrapper.mm
:
cppEngine.addCallback(
[](int data) {
[CppEngine myStaticMethod: data];
}
);
… но это начинает выглядеть неприлично.
Вы можете выполнить селектор на цели:
[targ performSelector:sel withObject:data];
Других решений пока нет …