У меня есть два для петель, которые пытаются делать то же самое:Проверка соответствия протокола для цикла?
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 as! UpdateableComponent) .update (dt) –
Да, я верю, что так будет. Явное приведение должно быть в порядке, поскольку вы сначала фильтруете – Amloelxer