iphone - for 循环 - 忽略对象类型?

标签 iphone objective-c for-loop nsarray

我有时喜欢将 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:...])

编辑:这里是构建类过滤器谓词的方法:

Is it possible to filter an NSArray by class?

关于iphone - for 循环 - 忽略对象类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099913/

相关文章:

iphone - 监听来自UIWebView的所有请求

windows - 如何强制RAM编程?

python - For 循环迭代,范围从索引 1 重新开始

iphone - 如何检测 map View 上显示的注释标注?

html - 网站在 iPhone 上旋转 180 度

iphone - 如何以编程方式安装 iOS 应用程序?

objective-c - 尝试为 Mac 构建 Evernote SDK 总是会导致错误

ios - 找不到 'UIView' 的接口(interface)声明

ios - 在函数 swift 中输入 **nil**

javascript - 学习 Vanilla JavaScript,for 循环