arrays - for 循环中的协议(protocol)一致性检查?

标签 arrays swift loops for-loop protocols

我有两个 for 循环试图做同样的事情:

for item in components where item is UpdateableComponent
{
    item.update()
}


for item in components
{
    if let component = item as? UpdateableComponent
    {
        component.update()
    }
}

componentsComponent 的数组对象。 UpdateableComponent是一个基本上生成特定 Component 的协议(protocol)定期更新。 Component具有子类,例如 Timer、Player、Enemy 和其他与游戏相关的类,其中一些符合 UpdateableComponent协议(protocol),有些则没有。

第一个循环抛出错误 Component没有成员更新,这是事实,但是 UpdateableComponent协议(protocol)确实如此。为什么 where 子句没有过滤数组?第二个循环编译了,但是它能给我想要的效果吗?虽然它不像第一个那么干净,但我觉得它们(应该)达到相同的效果。

为什么第一个循环不是过滤 components 的有效选项数组到符合 UpdateableComponent 的对象协议(protocol)?

最佳答案

这是因为在第一个循环中没有从 Item 到 UpdatableComponent 的转换。编译器只看到您尝试在组件类型的项目上调用更新,而没有考虑到您实际上只是在 UpdateableComponent 上调用它的事实(我们知道我们只能从循环过滤器,但编译器没有)。第二个循环具有直接转换,因此编译器知道一个事实:如果 component 不为零,则 if 必须是 UpdatableComponent 类型。第二个循环将为您提供相同的预期效果。

关于arrays - for 循环中的协议(protocol)一致性检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38485459/

相关文章:

swift - 如何使用 Equatable 比较基于不同属性的自定义对象?

python 列表突变(for in loop vs range(len))

java - 以线性方式映射对象列表

java - 有没有办法使用循环来改进这段代码?

python - Numpy:根据列索引数组设置每行的 1 个元素

arrays - 有没有比数组更轻量级的替代品?

javascript - 从数组中删除/弹出元素

ios - 如何检查用户之前是否注册过(Firebase Auth)?

ios - TextView 在填充后在 iOS 中丢失样式

vba - 循环遍历文本框的二维数组