我有两个 for 循环试图做同样的事情:
for item in components where item is UpdateableComponent
{
item.update()
}
for item in components
{
if let component = item as? UpdateableComponent
{
component.update()
}
}
components
是 Component
的数组对象。 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/