协议一致性检查for循环?

时间:2016-07-20 16:02:23

标签: 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更新的协议。 Component有子类,如Timer,Player,Enemy和其他与游戏相关的类,其中一些符合UpdateableComponent协议,有些则不符合Component协议。

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

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

1 个答案:

答案 0 :(得分:1)

这是因为从Item到UpdatableComponent的第一个循环中没有强制转换。编译器只看到您尝试在类型为component的项目上调用update,并且没有考虑到您实际上只在UpdateableComponent上调用它的事实(我们知道我们只从循环过滤器获取UpdateableComponent,但编译器没有。第二个循环有一个直接强制转换,因此编译器知道如果组件不是nil,则if必须是UpdatableComponent类型。第二个循环将为您提供相同的所需效果。

相关问题