我正在使用Swift,SpriteKit和Xcode 6,
我有一个SKSpriteNode类的数组:
class EnemyVehicle: SKSpriteNode {
}
var vehicles = [EnemyVehicle]()
所以我可以像这样添加元素到这个数组:
vehicles.append(EnemyVehicle(imageNamed:"mySprite"))
超类SKSpriteNode包含一个position.y属性,我可以使用vehicle[x].position.y
在数组的每个元素中访问它。
我的问题是:是否可以测试数组中的每个特定属性(此处为position.y)并观察它是否符合条件?例如,如果我想要一个条件,只有当我的数组中所有元素的所有position.y值都优于0时才是真的?我知道我可以通过循环来实现它,但还有另一种更简单的方法吗?
答案 0 :(得分:0)
听起来你想减少。
Reduce接受一个起始值,然后是一个闭包,它接受运行值和数组的下一个元素,并将这两个元素组合在一起,将结果向前传递以与下一个元素组合。
例如:
let a = [1,2,3]
// starting with zero, add each element to a total
let sum = a.reduce(0) { total, i in total + i }
// sum = 6
要检查数组中的所有元素是否与给定条件匹配,您需要一个组合函数来检查属性并返回true或false,并使用以前的条件:
// assuming you’re ok for true for an empty array:
let allAboveGround = vehicles.reduce(true) {
previous, vehicle in
previous && vehicle.position.y > 0
}
这有一个缺点 - 一旦你达到一个假的价值,你就可以在那里停下来,因为整体价值不可能是真的。 Reduce不适合这个,所以你可能想写一个循环,或者一个包裹循环的all
函数,在这些条件下提前退出:
func all<S: SequenceType>(source: S, pred: S.Generator.Element->Bool) -> Bool {
for x in source {
if !pred(x) { return false }
}
return true
}
let allAboveGround = all(vehicles) { $0.position.y > 0 }