Swift 快速检查两个元素是否满足类型组合

Swift 快速检查两个元素是否满足类型组合,swift,generics,Swift,Generics,我想检查两个对象是否满足其中一个是一种类型,另一个是另一种类型的条件。对象的顺序无关紧要,只有类型组合。有什么好办法吗 我想到了这个: if let shot = o0 as? ShotGameObject ?? o1 as? ShotGameObject, let o = o0 as? TakeDamage ?? o1 as? TakeDamage { o.takeDamage(shot.damage) } 或者这个:

我想检查两个对象是否满足其中一个是一种类型,另一个是另一种类型的条件。对象的顺序无关紧要,只有类型组合。有什么好办法吗

我想到了这个:

    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循环

现在可能有很多不同的两种类型的组合,我想检查一下。那么,像第一次那样写很多陈述会非常难看。另一个会更好,但效率更低


我试图提出一个泛型函数来强制转换为一个类型元组,但到目前为止还无法做到这一点。

这里有一个泛型函数来强制转换为一个类型元组

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
    }
}

这里有一个用于转换为类型元组的通用函数

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
    }
}