我是第一次在Objective C上编程,来自C ++(到目前为止我喜欢 后者好多了!)。我有一个关于可变数组的问题,即我想创建一个具有我的一个对象的特定类型的'CMParticle',而不是通用的ID类型。要从我的可变数组中访问我的对象中的数据,我必须每次都将它作为我的一个对象(我相信这很麻烦),就像这样:
rij[0] = ((CMParticle *)particles[*pi]).crds[0] - ((CMParticle *)particles[*pj]).crds[0];
其中'粒子'是我的可变CMParticle对象数组。我宁愿这样做
rij[0] = particles[*pi].crds[0] - particles[*pj].crds[0];
在此之前,我声明我的可变数组如下:
particles = [NSMutableArray array];
如果我能以某种方式用我的类型声明这个数组会很好,所以我不必每次都进行类型转换。有没有办法做到这一点?
答案 0 :(得分:1)
你想要做的事情在目标C中实际上没有意义。
C ++容器是同质的,但是通用的。您可以拥有vector<CMParticle>
或vector<int>
,但它们的类型不同。
ObjC容器是异构的。你只有一个NSArray
,它可以容纳CMParticle
个对象,NSNumber
个对象或其他任何东西,它们都混合在一个大数组中。
你通常根本不需要这些演员阵容。如果您要向my_array[3]
发送消息,请执行[my_array[3] doSomething:15]
。就像更高级的语言(Python,Ruby,Smalltalk,Javascript等)。
唯一的问题是(与Python等不同),有些情况下你做需要演员表。最关键的(也是令人讨厌的),如果你想直接访问成员,你必须先进行投射。这是ObjC(与Python等不同)鼓励您使用@property
和/或显式访问器而不是直接访问成员的原因之一。 (另外,作为一个更小的烦恼,因为变量已经声明了类型,你不能只写tempval = my_array[3];
,你必须指定类型,如:CMParticle *tempval = my_array[3]
。)
另一种看待这种情况的方法:C ++扩展了C的静态弱类型系统,为您提供了更强大的静态类型系统;相反,ObjC会在一个单独的动态类型系统上进行操作(遗憾的是,现有的C材料会保持不变,这是偶然出现问题的地方)。
您可以非常轻松地编写自己的NSMutableArray
子类,它是通用的(在运行时获取类,当然,与C ++的编译时间不同)并且是同质的,但所有这些都是添加限制;这些元素到处都是id
。围绕 的唯一方法是为每个数组编写自定义类:MutableCMParticleArray
,MutableNSNumberArray
等。