我想检查两个对象是否满足条件,其中一个是一种类型,另一种是另一种类型。对象的顺序无关紧要,只有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循环。
现在可能会有很多不同的两种类型的组合,我想检查一下。然后像第一个那样编写许多语句会非常难看。另一个会更好,但效率更低......
我试图提出一个通用函数让我转换为类型的元组,但到目前为止还没能做到。
答案 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
}