Я хочу проверить, удовлетворяют ли два объекта условием, что один из них имеет один тип, а другой - другого типа. Порядок объектов не имеет значения, только комбинация типов. Есть ли хороший способ сделать это?Быстро проверить, соответствуют ли два элемента комбинациям типов
Я придумал это:
if let shot = o0 as? ShotGameObject ?? o1 as? ShotGameObject,
let o = o0 as? TakeDamage ?? o1 as? TakeDamage {
o.takeDamage(shot.damage)
}
Или это:
for (o0, o1) in [(go0, go1), (go1, go0)] {
switch (o0, o1) {
case (let x as ShotGameObject, let y as TakeDamage):
y.takeDamage(shot.damage)
default:()
}
}
Первый кажется более эффективным, но это не очень с повторением и прочее.
Другой будет генерировать накладные расходы, создав ненужный массив с двумя наборами кортежей и циклом for.
Теперь потенциально может быть множество различных комбинаций двух типов, которые я хочу проверить. Тогда написание многих утверждений, подобных первой, будет действительно уродливым. Другой был бы более приятным, но менее эффективным ...
Я попытался создать общую функцию, которая позволила бы мне наложить на кортеж типов, но до сих пор не смог этого сделать.