esq*_*qew 7 iphone for-loop objective-c nsarray
我有时喜欢将IB元素组织成NSArrays主要是为了帮助我组织我的元素.通常,不同类别的对象使它们彼此成为相同的数组.虽然这是一种方便的组织方式,但我似乎无法理解为什么如果我有这样的数组:
NSArray *array = [NSArray arrayWithObjects:((UITextField *)textField), ((UISegmentedController *)segmentedController), nil];
Run Code Online (Sandbox Code Playgroud)
当我放置这样的for循环时,为什么我得到"不响应选择器"消息:
for (UITextField *text in array) {
[text setText:@""];
}
Run Code Online (Sandbox Code Playgroud)
该for循环似乎要传递是类的不是对象UITextField.
如果指定数组中的所有对象都通过循环,则声明对象类的重点是什么?
编辑仅供参考,这就是我现在处理它的方式:
for (id *object in array) {
if ([object isMemberOfClass:[UITextField class]]) {
foo();
} else if ([object isMemberOfClass:[UISegmentedController class]) {
bar();
}
}
Run Code Online (Sandbox Code Playgroud)
SVD*_*SVD 10
当你这样做
for (UITextField *text in...
Run Code Online (Sandbox Code Playgroud)
数组中的对象指针被强制转换为UITextField*类型 - 所以如果对象实际上不是UITextField,如果你试图调用UITextField方法,可能会发生各种奇怪的事情.
所以改为使用id类型(no*needed,btw):
for (id obj in array)
Run Code Online (Sandbox Code Playgroud)
然后像您一样检查类型并调用适当的方法.或者,过滤数组以仅获取特定类型的对象,然后仅访问该类型:
for (UITextField* text in [array filteredArrayUsingPredicate:...])
Run Code Online (Sandbox Code Playgroud)
编辑:这是如何构建类过滤谓词:
如果指定数组中的所有对象都通过循环,则声明对象类的重点是什么?
类名就是让编译器知道它应该找到什么.这允许它试图找出它应该让你调用的方法以及如何处理对象.它与传递int给一个方法的想法是一样的float.该方法不会忽略整数 - 它假设您传递的是正确的类型.你只是给这个结构提供了比它应得的更多信用:
for (UITextField *text in array)
Run Code Online (Sandbox Code Playgroud)
它只是没有这个功能.你现在如何处理它是正确的方法.