0

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

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

4

1 回答 1

1

您尝试做的事情在Objective C中实际上没有意义。

C++ 容器是同质的,但通用的。您可以有 avector<CMParticle>或 a 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等。

于 2013-04-22T21:47:34.963 回答