可变数组对象类型

时间:2013-04-22 21:38:33

标签: objective-c

我是第一次在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];

如果我能以某种方式用我的类型声明这个数组会很好,所以我不必每次都进行类型转换。有没有办法做到这一点?

1 个答案:

答案 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。围绕 的唯一方法是为每个数组编写自定义类:MutableCMParticleArrayMutableNSNumberArray等。