2014-12-18 38 views
1

我正在與夫特,SpriteKit和Xcode的工作6,搜索如果在一個數組中的所有元素的特定屬性匹配的條件的

我有一個SKSpriteNode類的數組:

class EnemyVehicle: SKSpriteNode { 
} 

var vehicles = [EnemyVehicle]() 

因此,我可以元素加入到這個數組是這樣的:

vehicles.append(EnemyVehicle(imageNamed:"mySprite")) 

並且超SKSpriteNode包含是position.y一個屬性,我可以與我數組的每個元素進行訪問。

我的問題是:是否有可能測試在陣列(這裏position.y)每一個特定的屬性,看它是否符合條件?例如,如果我想要一個只有當我的數組中的所有元素的position.y值都優於0時才爲true的條件?我知道我可以用循環做到這一點,但是還有另一種更簡單的方法嗎?

回答

0

聽起來好像要減少。

減少需要起始值,然後封閉,是以運行值和陣列的下一個元素,並且這兩個元件結合在一起,攜帶結果着與下一個元素相結合。

例如:

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不適合此,所以您可能想要編寫一個循環,或者可能包含循環的函數,該函數會在這些條件下提前退出:

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 } 
相關問題