Жалуется ли компилятор, потому что он не знает, что 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
;затем он может определить, каким должно быть имя метода.