我创建了一个自定义按钮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"];
但是,当尝试编译时,我得到:
在非结构或联盟中请求成员“cycleList”
编译器是否在抱怨,因为它不知道
moduleList
的第0个元素将是ModuleUIButton
?如果是这样,如何从可变数组中引用ModuleUIButton
的任何属性?任何见识将不胜感激!
最佳答案
编译器是否在抱怨,因为它不知道moduleList
的第0个元素将是ModuleUIButton
?
究竟。 objectAtIndex:
的返回类型为id
。编译器无法知道实际的类型是什么,因此无法像通常那样将属性访问.cycleList
转换为正确的方法调用,因为它无法知道正确的方法是什么。
本质上,属性访问通过重写代码来工作。编译器将看到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
;然后可以确定方法名称应为。关于objective-c - 访问数组中的元素-请求不是结构或联合的成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6309874/