我有两个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
更新的协议。 Component
有子类,如Timer,Player,Enemy和其他与游戏相关的类,其中一些符合UpdateableComponent
协议,有些则不符合Component
协议。
第一个循环抛出UpdateableComponent
没有成员更新的错误,这是真的,但components
协议确实如此。为什么where子句不过滤数组?第二个循环编译,但它会给我想要的效果吗?它并不像第一个那样干净,我觉得他们(应该)也能达到同样的效果。
为什么第一个循环不是将UpdateableComponent
数组过滤到符合NSArray
协议的对象的有效选项?
答案 0 :(得分:1)
这是因为从Item到UpdatableComponent的第一个循环中没有强制转换。编译器只看到您尝试在类型为component的项目上调用update,并且没有考虑到您实际上只在UpdateableComponent上调用它的事实(我们知道我们只从循环过滤器获取UpdateableComponent,但编译器没有。第二个循环有一个直接强制转换,因此编译器知道如果组件不是nil,则if必须是UpdatableComponent类型。第二个循环将为您提供相同的所需效果。