我在iOS中有Objective-C类,有一个类型为c ++类的字段。
我没有c ++类的定义。
如何获取此字段的值?
以及如何更改此c ++类型字段的字段值?
例如。
@interface A
B b // c++ type
@end
class B {
int c;
}
如何获取b
的值?如何更改c
的值?
答案 0 :(得分:0)
具有访问者和mutator的getter / setters:
class B {
public:
int getC() { return c };
void setC(int c_) { c = c_ };
private:
int c;
}
int main()
{
B b;
B.setC(50); // c = 50
int x = B.getC() // x = 50;
return 0;
}
答案 1 :(得分:0)
编辑:我误解了您的问题。
免责声明:在撰写本文时,我无权访问iOS工具链来验证Objective-C信息,但基于我过去与Objective-C和iOS的合作经验,我对该答案充满信心。
Objective-C运行时提供类型自省。
如果C ++成员是字段:
使用this post或类似方法中的技术,然后隔离您感兴趣的ivar。
如果使用上述文章中的循环技术:
processed_list = [{key: (int(value) if key.endswith(('id', 'type')) else value)
for key, value in entry.items()}
for entry in processed_list]
如果C ++成员是属性:
如果您只是访问Obj-C属性值,我会说遵循this answer并将其命名为day,但是由于它是C ++属性值,因此细节尚不清楚。我不确定这是否有可能。
C ++具有friendship的概念,可以从一种类型访问另一种类型的非公共成员。
即
if (strcmp(name, "target_field") == 0) {
ptrdiff_t offset = ivar_getOffset(var);
CppObject* cppObject = (CppObject*)(((ptrdiff_t*)&targetObjcInst) + offset);
// Access the public members of CppObject...
}
这不会扩展到Objective-C。除非我不知道某些特定的编译器扩展,否则Obj-C接口不能与C ++类型成为“朋友”,因此Obj-C无法访问C ++类型的私有组件。提供公共访问者/更改者或将该字段公开是您唯一的便携式选择。