[英]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()
}
}
components
是Component
对象的数组。 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.