Доступ к элементу в массиве - запрос на членство в чем-то, не являющемся struture или union - PullRequest
1 голос
/ 10 июня 2011

Я создал пользовательскую кнопку с именем ModuleUIButton, которая наследуется от UIButton. Эта пользовательская кнопка имеет свойство изменяемого массива с именем cycleList.

У меня есть изменяемый массив ModuleUIButton с именем moduleList. Мне нужно иметь доступ к элементу изменяемого массива cycleList, и я использую следующий вызов:

//Create ModuleUIButton
ModuleUIButton *newModuleButton = [[ModuleUIButton alloc] 

//Customize ModuleUIButton
initWithFrame:CGRectMake(29.0,  (200.0+(88*moduleCounter)), 692, 80.0)];
[newModuleButton setTitle:@"Module" forState:UIControlStateNormal];
[newModuleButton setBackgroundColor:[UIColor purpleColor]];

//Add newModuleButton to moduleList array
[moduleList addObject:newModuleButton];

//Access the first element in moduleList which is newModuleButton and add
// a string to it's cycleList property
[[self.moduleList objectAtIndex:0].cycleList addObject:@"new Cycle"];

Однако, пытаясь скомпилировать, я получаю:

Запрос на член 'cycList' в чем-то, не являющемся структурой или объединением

Компилятор жалуется, потому что не знает, что 0-й элемент moduleList будет ModuleUIButton? Если так, как я могу получить доступ к любому из свойств ModuleUIButton s, ссылаясь на него из изменяемого массива?

Любое понимание будет оценено!

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Жалуется ли компилятор, потому что он не знает, что 0-й элемент moduleList будет ModuleUIButton?

Точно.Тип возврата objectAtIndex: - id.Компилятор не может знать, что такое тип фактический , и поэтому не может превратить доступ к свойству .cycleList в правильный вызов метода, как обычно, потому что он не может знать, какой метод правильныйis.

Доступ к свойству по существу работает путем переписывания вашего кода.Компилятор видит foo.bar и переходит к классу foo, находит методы, соответствующие свойству bar, и, в зависимости от ситуации, превращает то, что вы написали, в [foo bar] или [foo setBar:].Хитрость заключается в том, что, поскольку методы, связанные со свойством, могут иметь любое имя (не только стандартное bar / setBar), компилятор должен быть в состоянии определить тип объекта, чтобынайдите правильные имена методов для использования.

Когда вы используете синтаксис скобок, вы сообщаете компилятору точное имя метода, который вы хотите вызвать.Он не должен выполнять поиск, он просто превращает это в обычный вызов objc_msgSend.

Если так, как я могу получить доступ к любому из свойств ModuleUIButton, ссылаясь наэто из изменяемого массива?

Просто используйте «стандартный» синтаксис:

[[self.moduleList objectAtIndex:0] cycleList]

Вы также можете дать подсказку компилятору, приведя, как предложил Taskinoor:

((ModuleUIButton *)[self.moduleList objectAtIndex:0]).cycleList

Это явно указывает компилятору обрабатывать объект, возвращаемый из objectAtIndex:, как ModuleUIButton;затем он может определить, каким должно быть имя метода.

1 голос
/ 10 июня 2011

Попробуйте разыграть так:

ModuleUIButton *button = (ModuleUIButton *)[self.moduleList objectAtIndex:0];
[button.cycleList addObject:@"new Cycle"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...