繁体   English   中英

协议一致性检查是否存在循环?

[英]Protocol conformance check in for loop?

我有两个试图做同样事情的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协议确实存在。 为什么where子句不过滤数组? 第二个循环可以编译,但是会给我想要的效果吗? 它不如第一个干净,我觉得他们(应该)达到相同的效果。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM