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

时间:2016-05-21 22:51:11

标签: swift generics

我想检查两个对象是否满足条件,其中一个是一种类型,另一种是另一种类型。对象的顺序无关紧要,只有Type组合。有没有一个很好的方法来做到这一点?

我想出了这个:

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

现在可能会有很多不同的两种类型的组合,我想检查一下。然后像第一个那样编写许多语句会非常难看。另一个会更好,但效率更低......

我试图提出一个通用函数让我转换为类型的元组,但到目前为止还没能做到。

1 个答案:

答案 0 :(得分: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
}