gpt4 book ai didi

objective-c - 为什么标准循环失败时快速枚举有效?

转载 作者:行者123 更新时间:2023-12-01 17:21:36 25 4
gpt4 key购买 nike

我有一个充满按钮的UIView * buttonView。我需要更新列表并重新填充buttonView。我实现了:

if ([[self.buttonView.subviews objectAtIndex:i] isKindOfClass:[UIButon class]]
[[self.buttonView.subviews objectAtIndex:i] removeFromSuperview];

但失败了,它不会删除所有按钮(在我的测试中有8个按钮,它删除了所有其他按钮:-?)

然后,我尝试:
for(UIView *subview in self.buttonView.subviews) 
{
if([subview isKindOfClass:[UIButton class]])
[subview removeFromSuperview];
}

而且效果很好。

两个循环不应该完成同一件事吗?

我猜我对快速枚举不了解的东西可以解释这一点?

最佳答案

我不认为您可以修改您要枚举的集合,因此请务必谨慎。看起来它可以很好地处理更改,并且可以遍历每个项目(与for循环不同)。

在第一种情况下,该操作将不起作用,因为一旦删除索引0,其他内容将变为索引0,但是您已移至索引1。可以在删除成功的情况下通过减小循环变量来解决此问题,使循环将其递增到其先前的值:

if ([[self.buttonView.subviews objectAtIndex:i] isKindOfClass:[UIButton class]]) {
[[self.buttonView.subviews objectAtIndex:i] removeFromSuperview];
--i;
}

for循环会发生什么:
1,2,3,4,5,6,7,8并删除第一项(1)
2,3,4,5,6,7,8并删除第二项(3)
2,4,5,6,7,8并删除第三项(5)
2,4,6,7,8并删除第四项(7)。
2,4,6,8,您就位于索引5上,该索引大于长度,因此就可以了。

关于objective-c - 为什么标准循环失败时快速枚举有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9283797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com