【问题标题】:Protocol conformance check in for loop?循环中的协议一致性检查?
【发布时间】:2016-07-20 16:02:22
【问题描述】:

我有两个 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 是一个协议,它基本上会定期更新特定的 ComponentComponent 有子类,例如 Timer、Player、Enemy 和其他与游戏相关的类,其中一些符合 UpdateableComponent 协议,而另一些则不符合。

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

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

【问题讨论】:

    标签: arrays swift loops for-loop protocols


    【解决方案1】:

    这是因为在从 Item 到 UpdatableComponent 的第一个循环中没有强制转换。编译器只看到你试图在组件类型的项目上调用 update 并且没有考虑到你实际上只是在 UpdateableComponent 上调用它的事实(我们知道我们只从循环过滤器,但编译器没有)。第二个循环有一个直接转换,所以编译器知道一个事实,如果组件不是 nil,if 必须是 UpdatableComponent 类型。第二个循环会给你同样想要的效果。

    【讨论】:

    • 那么在第一个循环中,这可以接受吗? (item as!UpdateableComponent).update(dt)
    • 是的,我相信会的。显式转换应该没问题,因为您首先要过滤
    猜你喜欢
    • 2019-12-31
    • 1970-01-01
    • 2014-08-02
    • 2014-11-09
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多