Нужно ли использовать точечную запись в Objective C для доступа к значениям структуры? - PullRequest
2 голосов
/ 03 января 2012

Я искал ответ на этот простой вопрос, но не повезло.Итак, вот оно: возможно ли получить доступ к значениям структуры объекта в Objective-C без использования точечной нотации, т. Е. С использованием только канонического синтаксиса сообщения?Например, предположим, что у нас есть переменная экземпляра CGPoint, position, определенная для объекта Particle:

//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), это правда?

Ответы [ 3 ]

6 голосов
/ 03 января 2012

A CGPoint - это просто старый C struct, а не класс target-c, поэтому вы не можете отправлять ему сообщения.Вам нужно использовать синтаксис C для чтения членов структуры, то есть '.'

5 голосов
/ 03 января 2012

Структуры из C и поэтому должны быть доступны с использованием традиционных методов C.Вы получаете доступ к полям структуры, используя ., или отменяете их, используя ->, и это единственный способ сделать это.Передача сообщений - это задача Objective-C, которая не имеет смысла, потому что на самом деле они не являются объектом Objective-C.

4 голосов
/ 03 января 2012

Это невозможно.Оператор-член является оператором C для доступа к членам structs.

Методы Objective-C работают только с типами Objective-C, поэтому этот синтаксис вызова метода не может работать на structзначения, которые не типы Objective-C.

(Если среда выполнения Objective-C не поддерживает это, чего в настоящее время нет, и я надеюсь, что не будеттак и в будущем.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...