搜索数组的所有元素中的特定属性是否与条件匹配

时间:2014-12-18 22:44:44

标签: arrays testing swift element conditional-statements

我正在使用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时才是真的?我知道我可以通过循环来实现它,但还有另一种更简单的方法吗?

1 个答案:

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