2016-06-20 24 views
1

Ich habe ein Stück Code, den ich nur ausführen möchte, wenn bestimmte Bedingungen für jedes Element in einem Array erfüllt sind. Zurzeit muss ich die Länge des Arrays kennen, damit der Code funktioniert, aber mein Endziel ist, dass er für ein Array beliebiger Länge funktioniert.Wie überprüfe ich eine Bedingung für jedes Element in einem Array?

Mein aktueller Code:

if (rand[0] == someInt && rand[1] == someInt && . . . && rand[n] == someInt) { 

    *do some things* 

} 

Ich möchte dies nicht arbeiten, um die Länge von rand zu kennen.

+0

Verwenden Sie 'forEach': http://swiftdoc.org/v2.2/type/Array/#func-foreach_ –

+0

Mögliche Duplikate von [überprüfen Sie, ob alle Elemente eines Arrays in Swift den gleichen Wert haben] (http: //stackoverflow.com/questions/29588158/check-if-all-elements-of-an-array-have-the-same-value-in-swift) –

Antwort

1

Versuchen Sie folgendes:

if rand.reduce(true, combine: {$0 && $1 == someInt}) 
{ 
    print("do some thing") 
} 

Die verringern Funktion können Sie einen Anfangswert und einen Verschluss liefern, die einen Wert dieses Typs bildet und ein Element des Arrays auf einen Wert von der gleichen Art wie Ihr Anfangswert , dann wendet es diese Funktion auf jeden Wert im Array an. Dies führt nur zu einem AND-Vergleich der einzelnen Elemente des Arrays mit dem gewünschten Wert. Konzeptionell entspricht dies dem, was Sie ursprünglich geschrieben haben.

Wenn Sie $ 0 und $ 1 nicht gesehen haben, können sie verwirrend sein; Sie sind nur die Argumente für die anonyme Schließung, die Sie zum Reduzieren angegeben haben. In diesem Fall ist $ 0 ein boolescher Wert und $ 1 ein Element Ihres Arrays.

1

Neben reduce, möchten Sie vielleicht über filter lernen, was hilfreich sein kann, wenn Sie sich um den "else" -Fall kümmern oder messen, wie nah Sie dem Erfolg sind. Zum Beispiel:

let matches = rand.filter { $0 == someInt } 

if rand.count == matches.count { 
    print("there were \(matches.count) matches") 
    // do some things 
} else { 
    print("there were only \(matches.count) of \(rand.count) total possible matches") 
} 
+0

arrayName.filter {$ 0.propertyName == true} <- Sehr schön! Danke für Ihre Hilfe – nurxyz

2

In Swift 3, mit first(where:), dies ist sehr einfach:

extension Sequence { 
    func allPass(predicate: (Iterator.Element) -> Bool) -> Bool { 
     return first(where: { !predicate($0) }) == nil 
    } 
} 

In Swift 2.2, ist es ähnlich:

extension SequenceType { 
    func allPass(predicate: (Generator.Element) -> Bool) -> Bool { 
     for element in self { 
      if !predicate(element) { return false } 
     } 
     return true 
    } 
} 

In jedem Fall diese sofort zurück false, wenn sie das erste fehlerhafte Element finden.