for loops - 忽略对象类型?

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)

编辑:这是如何构建类过滤谓词:

是否可以按类过滤NSArray?


Luk*_*uke 5

如果指定数组中的所有对象都通过循环,则声明对象类的重点是什么?

类名就是让编译器知道它应该找到什么.这允许它试图找出它应该让你调用的方法以及如何处理对象.它与传递int给一个方法的想法是一样的float.该方法不会忽略整数 - 它假设您传递的是正确的类型.你只是给这个结构提供了比它应得的更多信用:

for (UITextField *text in array)
Run Code Online (Sandbox Code Playgroud)

它只是没有这个功能.你现在如何处理它是正确的方法.