2016-05-21 6 views
2

Also für mein erstes Projekt habe ich daran gearbeitet eine Golf Scorecard App zu erstellen. Ich habe ein Array für jeden Spieler 18 Löcher und ein separates Array in einer anderen Klasse für den Kurs Par. Ich kann den Gesamtpunktestand vom Gesamtwert abziehen, um ein Endergebnis von 90 Punkten (+18) zu erhalten. Wenn jedoch alle Löcher einen Par-Satz haben, aber der Spieler nur 9 Löcher absolvierte, sieht der Punktestand wie 45 (-27) aus. Spieler Partituren sind standardmäßig 0, damit ich versuchen, dachteWie erhält man die Werte zweier separater Int-Arrays, die nach Index gepaart werden und dann bedingte Operationen für bestimmte Paare ausführen?

zip(playerScoreArray, courseParArray).enumerate().filter() 

zu tun, wo ich, dass alle playerScore Holes ausfiltern würde! = 0, fügen diese zusammen, nehmen Sie die Par für jedes dieser Löcher und fügen diese zusammen , und subtrahiere die gesamten abgeschlossenen playerHoleScores von courseParNubers. Dies würde mir ein genaues + oder - Par nur auf den Löchern geben, die sie bisher abgeschlossen haben.

Ich habe die Array.reduce (0, kombinieren +) verwendet, aber abgesehen davon lerne ich immer noch die komplexeren Möglichkeiten der Manipulation Sammlungen und Schließungen.

Beispiel von dem, was ich versuche zu erreichen:

let playerScoreArray = [7, 5, 6, 4, 0, 0, 0, 0, 0] 
let holeParArray =  [4, 3, 5, 5, 4, 3, 4, 4, 4] 
// get result 7-4, 5-3, 6-5, 4-5 = +5 
// currentResult = 22-36 = -14 

Dank

Antwort

1

Sie entweder den Test innen machen könnten reduzieren und nur diejenigen hinzufügen, in dem der Spieler-Score nicht Null war:

let total = zip(playerScoreArray, holeParArray).reduce(0) { (sum, pair) in 
    return pair.0 == 0 ? sum : sum + pair.0 - pair.1 
} 

Oder filtern diejenigen Paare, bevor reduzieren Aufruf:

let total = zip(playerScoreArray, holeParArray).filter({ $0.0 > 0 }).reduce(0) { (sum, pair) in 
    return sum + pair.0 - pair.1 
} 
+0

Ich benutzte das Top und es funktionierte perfekt, danke – JustinM