【问题标题】:Do I have to use dot notation in Objective C to access structure values?我必须在 Objective C 中使用点符号来访问结构值吗?
【发布时间】:2012-02-01 03:32:04
【问题描述】:

我已经到处寻找这个简单问题的答案,但没有运气。所以这里是:是否可以在 Objective-C 中访问对象的结构值而不使用点表示法,即仅使用规范的消息语法?例如,假设我们有一个为 Particle 对象定义的 CGPoint 实例变量 position:

//Particle.h
@interface Particle : NSObject {
CGPoint position
}
@property CGPoint position;
@end

以及相应的实现:

//Particle.m
#import "Particle.h"
@implementation Particle
@synthesize position;
@end

假设在其他一些 *.m 文件(比如 AppController.m)中我们有:

a_particle = [Particle alloc];
[a_particle setPosition:CGPointMake(x_val,y_val)];

那我们为什么不能使用:

[[a_particle position] x];

获取 x_val 而不是:

a_paticle.position.x;

注意到后者工作正常?还要注意

[a_particle position].x;

会起作用,但我会尽量避免用点表示法使事情变得混乱。我的直觉是结构实例变量必须使用点符号来访问其值(在本例中为 x_val 和 y_val),这是真的吗?

【问题讨论】:

    标签: objective-c syntax


    【解决方案1】:

    CGPoint 只是一个普通的旧 C struct,不是一个 Objective-c 类,所以你不能向它发送消息。你需要使用C的语法来读取结构成员,即'.'

    【讨论】:

    • 谢谢,这是我的怀疑,但我试图避免用点把我的代码弄乱。
    • 不是杂乱无章,就是C语言。
    【解决方案2】:

    结构来自 C,因此必须使用传统的 C 方法访问。您使用. 访问结构的字段或使用-> 取消引用它们,这是唯一的方法。传递消息是 Objective-C 的事情,并没有真正的意义,因为它们实际上不是 Objective-C 对象。

    【讨论】:

      【解决方案3】:

      这是不可能的。 member 运算符是一个 C 运算符,用于访问structs 的成员。

      Objective-C 方法仅在 Objective-C 类型上运行,因此相同的方法调用语法不可能对struct 值起作用,这些值不是 Objective-C 类型。

      (除非 Objective-C 运行时支持它,它目前不支持,我希望将来不会这样做。)

      【讨论】:

      • 谢谢雅各布,我也喜欢你的解释。
      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 2015-03-08
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      相关资源
      最近更新 更多