【问题标题】:Swift check if two elements satisfy a combination of types快速检查两个元素是否满足类型组合
【发布时间】:2016-05-23 04:34:33
【问题描述】:

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

我想出了这个:

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

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

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

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    这是一个转换为类型元组的通用函数

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-26
      • 2013-03-06
      • 2017-06-25
      • 2022-01-02
      • 1970-01-01
      • 2012-07-29
      • 2012-10-01
      • 2017-06-20
      • 2021-12-07
      相关资源
      最近更新 更多