【问题标题】:Search if a specific attribute in all the elements of an array match a condition搜索数组的所有元素中的特定属性是否与条件匹配
【发布时间】:2014-12-18 22:44:44
【问题描述】:

我正在使用 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 时才为真的条件?我知道我可以通过循环来做到这一点,但还有其他更简单的方法吗?

【问题讨论】:

    标签: arrays testing swift element conditional-statements


    【解决方案1】:

    听起来你想要减少。

    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
    

    要检查数组中的所有元素是否符合给定条件,您需要一个组合函数来检查属性并返回真或假,并与之前的条件相匹配:

    // 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 }
    

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多