2016-05-21 3 views
0

Я хочу проверить, удовлетворяют ли два объекта условием, что один из них имеет один тип, а другой - другого типа. Порядок объектов не имеет значения, только комбинация типов. Есть ли хороший способ сделать это?Быстро проверить, соответствуют ли два элемента комбинациям типов

Я придумал это:

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.

Теперь потенциально может быть множество различных комбинаций двух типов, которые я хочу проверить. Тогда написание многих утверждений, подобных первой, будет действительно уродливым. Другой был бы более приятным, но менее эффективным ...

Я попытался создать общую функцию, которая позволила бы мне наложить на кортеж типов, но до сих пор не смог этого сделать.

ответ

2

Вот общая функция, чтобы бросить в кортеж типов

func tupleTypeChecker<T,U>(lhs: Any, rhs: Any) -> (T, U)? { 
    switch (lhs, rhs) { 
    case let (lhs as T, rhs as U): return (lhs, rhs) 
    case let (lhs as U, rhs as T): return (rhs, lhs) 
    default: return nil 
    } 
} 

использование образца:

if let pair:(Int, String) = tupleTypeChecker("hey", rhs: 1) { 
    let b = pair.0 + 3//computes to 4 
} 
Смежные вопросы