2012-01-02 66 views
2

我已經搜遍了這個簡單問題的答案,沒有運氣。因此,這裏是:是否可以在不使用點符號的情況下訪問Objective-C中的Object的結構值,即僅使用規範消息語法?例如,讓我們說,我們有一個CGPoint實例變量,位置,對於一個粒子對象定義:我是否必須在Objective C中使用點符號來訪問結構值?

//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),這是真的嗎?

回答

6

A CGPoint只是一個普通的老C struct,不是一個Objective-C類,所以你不能發送消息給它。你需要使用C的語法來讀取結構成員,即'。'

+0

謝謝,這是我懷疑的,但是試圖避免用點來混淆我的代碼。 – 2012-01-03 00:23:46

+1

這不是混亂,它只是C語言。 – sbooth 2012-01-03 01:55:44

4

這是不可能的。成員運營商是訪問structs成員的C運營商。

Objective-C的方法只對目標C類型進行操作,因此,不可能對此相同的方法調用的語法上struct值,它是 Objective-C的類型的工作。

(除非Objective-C的運行時支持它,它目前沒有,我希望在未來也不會這麼做。)

+0

謝謝Jacob,我也很喜歡你的解釋。 – 2012-02-05 04:29:43

5

結構是由C,因此必須使用傳統Ç方法進行訪問。您可以使用.訪問結構的字段,也可以使用->取消引用它們,這是實現它的唯一方法。傳遞消息是一個Objective-C的東西,並沒有什麼意義,因爲它們實際上不是一個Objective-C對象。

+0

謝謝傑森,很好的解釋。 – 2012-02-05 04:30:23

相關問題