Цель-C: Доступ к объектам-членам, которые находятся в массиве?!?Я думаю - PullRequest
1 голос
/ 11 июля 2010

Абсолютно новый для Obj-C, так что спасибо за терпение. : P

Поскольку я начинающий, я буду использовать пример с машиной. Мне легче понять.

У меня есть объект, машина. Имеет два объекта-члена: шину и двигатель.

У шины и движка тоже есть свои собственные переменные-члены, но они просто int с различными именами (например, pressure, treadDepth).

Во всех этих случаях я синтезировал методы доступа. Я не уверен насчет методов доступа к объектам, поэтому я просто создал шину @property id engine / @property id Надеюсь, что это правильно!

Теперь я могу использовать стиль dot.notation для доступа, например: [car.engine цилиндры]. Отлично! Отправка сообщений о шинах и двигателе работает нормально. Я пишу методы, эта запись, кажется, работает.

Но когда я объявляю массив объектов, таких как 4 шины для автомобиля:

@interface Car : NSObject {
     tire *tires[4];
}

Я не могу отправить это сообщение вот так

[car.tire[0] setPressure: int];

В нем говорится, как получить доступ к неизвестному методу получения шин.

В основном мне интересно, может ли кто-нибудь помочь мне понять, как правильно обращаться к переменным-членам объекта, который находится в массиве.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 11 июля 2010

Вы пытаетесь вызвать геттера на car, который не существует. В любом случае вы не можете вернуть массив в стиле C по значению, поэтому вместо простого возврата указателя Tire* я бы в этом случае использовал NSArray:

// header:
@interface Car : NSObject {
    NSArray *tires;
}
@property (nonatomic, copy) tires;
// ...

// source:
@implementation Car
@synthesize tires;

- (id)init {
    if ((self = [super init])) {
        tires = [[NSArray alloc] initWithObjects:
                  [[[Tire alloc] init] autorelease],
                  // ...
                  nil];
        // ...
    }
    return self;
}

- (void)dealloc {
    [tires release]; // don't forget to clean up
    // ...
}

Теперь вы можете использовать геттер:

[[[car.tires] objectAtIndex:0] setPressure:0];
0 голосов
/ 11 июля 2010

Ну, вы можете использовать массивы в стиле Objective-C. Тогда у вас будет что-то вроде:

NSArray *tires = [NSArray arrayWithObjects: tire1, tire2, tire3, tire4];

И тогда вы получите к ним доступ как:

[tires objectAtIndex:0];

Это предполагает, что вы используете синтезированные методы, как описано. Я не уверен в вашем вопросе, но кажется, что вы, возможно, захотите определить класс «шина» для этих объектов (а не просто метод, это все, что я вижу выше), который наследуется от NSObject или, возможно, от вашего собственного класс CarPart и т. д. Затем вы выделяете 4 шины в цикле и вызываете метод init, который устанавливает состояние по умолчанию (надеюсь, лучше, чем пончик, который был в качестве запасного в моей машине), а затем добавляете их в свой массив в «Car». когда вы инициализируете автомобиль.

0 голосов
/ 11 июля 2010

Почему бы не поместить все ваши tire объекты в NSArray или NSSet?Или, поскольку вы знаете, что их всего четыре, вы можете просто определить свойства frontLeftTire, frontRightTire и т. Д.

0 голосов
/ 11 июля 2010

Ах, хорошо.Ой!

Нужно написать индексированный метод доступа.Это не часть сделки @synthesize?О человек!

: P

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