我有时喜欢将 IB 元素组织到 NSArray
中,主要是为了帮助我组织我的元素。最常见的是,不同类的对象将它们放入同一个数组中。虽然这 是一种方便的组织方式,但我似乎无法理解为什么我有这样的数组:
NSArray *array = [NSArray arrayWithObjects:((UITextField *)textField), ((UISegmentedController *)segmentedController), nil];
当我像这样放置 for
循环时,为什么会收到“不响应选择器”消息:
for (UITextField *text in array) {
[text setText:@""];
}
for
循环似乎传递了不属于 UITextField
类的对象。
如果指定数组中的所有对象都通过循环传递,那么声明对象的类有什么意义?
编辑 仅供引用,这是我目前的处理方式:
for (id *object in array) {
if ([object isMemberOfClass:[UITextField class]]) {
foo();
} else if ([object isMemberOfClass:[UISegmentedController class]) {
bar();
}
}
最佳答案
当你做的时候
for (UITextField *text in...
数组中的对象指针被强制转换为 UITextField* 类型 - 因此,如果对象实际上不是 UITextField,则如果您尝试调用 UITextField 方法,可能会发生各种奇怪的事情。
所以改为使用 id 类型(不需要 *,顺便说一句):
for (id obj in array)
然后像您一样检查类型并调用适当的方法。或者,过滤数组以仅获取特定类型的对象,然后仅遍历该类型:
for (UITextField* text in [array filteredArrayUsingPredicate:...])
编辑:这里是构建类过滤器谓词的方法:
关于iphone - for 循环 - 忽略对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099913/