2016-04-07 6 views
1

Ich habe einen einfachen Code, der funktioniert und den ich in altmodischer Weise programmieren und ich bin mir sicher, es gibt eine elegantere Art, dies in swift zu tun. Hier ist der Code:eleganter Code für wenn in swift

var cardsInCompartment1:Int = 0 
    var cardsInCompartment2:Int = 0 
    for card in cards{ 
     if card.compartment == 1{ 
      cardsInCompartment1 += 1 
      print(cardsInCompartment1) 
     } 
     if card.compartment == 2{ 
      cardsInCompartment2 += 1 
      print(cardsInCompartment2) 
     } 
    } 

Ich habe im Grunde Karten in verschiedenen Fächern und jetzt will ich zählen, wie viele Karten in jedem Fach ist.

Antwort

3

Wie wäre es mit filter die gewünschten Karten auszuwählen? Dann können Sie einfach count sie:

let cardsInCompartment1 = cards.filter { $0.compartment == 1 }.count 
let cardsInCompartment2 = cards.filter { $0.compartment == 2 }.count 

Wenn Sie eine Reihe von Fächern haben, können Sie die Zählungen in einem Wörterbuch speichern könnte:

var compartmentCounts = [Int:Int]() 

cards.forEach { 
    compartmentCounts[$0.compartment] = (compartmentCounts[$0.compartment] ?? 0) + 1 
} 

In diesem Fall würde der Schlüssel sein, der Fach #, und der Wert wäre die Kartenanzahl. Etwas wie [1: 32, 2: 42], wenn 32 und 42 Karten in jedem Fach vorhanden sind.

+0

Das Hauptproblem hier ist, dass Sie jetzt zweimal über die Liste iterieren. –

+0

@ Magni- Ich sehe das nicht als ein großes Problem, es sei denn, es gibt ein nachweisbares Leistungsproblem. Es ist absolut möglich, dass der Compiler einen Großteil der Ineffizienz beseitigt ... und für eine kleine Anzahl von Karten spielt es keine Rolle. Für mich steht Code Lesbarkeit an erster Stelle. –

+0

@ magni- I aktualisiert mit einer Lösung, die es in einer Iteration tut. –

1

Versuchen Sie folgendes:

var cardsInCompartment1:Int = 0 
var cardsInCompartment2:Int = 0 
for card in cards { 
    (card.compartment == 1) ? (cardsInCompartment1 += 1) : (cardsInCompartment2 += 1) 
} 
0

Was ist mit einer switch-Anweisung? Etwas wie das?

var card:Int = 1 
var CardsInCompartment:Int = 0 
switch (card) { 
case 1: 
    CardsInCompartment += 1 
    print("CardsInCompartment \(CardsInCompartment)") 
case 2: 
    CardsInCompartment += 2 
    print("CardsInCompartment \(CardsInCompartment)") 
default: 
} 
0

Oder verwenden Sie einen Array Sie zählt zu halten:

var counts = [ 0, 0, 0 ] // create an array of integers, where the Ints in the array represent the count of cards in each compartment 
cards.forEach { counts[ $0.compartment ] += 1 } // for each card, increment the count in array corresponding to the compartment of the card. (if card.compartment == 1, increment counts[1], and so on 

print("cards in compartment 1 \(counts[1])") 
print("cards in compartment 2 \(counts[2])") 

(Dies setzt voraus, Ihre einzigen Fächer sind ganze Zahlen 1 und 2)

+0

Das ist genial, aber erinnert mich an die Programmierung in C-Wettbewerben, die ich ab und zu gesehen habe und die eine Herausforderung darstellen würde, wer den kleinsten Code für eine bestimmte Aufgabe erstellen könnte. Die Ergebnisse sind oft brilliant und völlig kryptisch, da es sehr schwer zu verstehen ist, was es getan hat. Keine Missachtung von Nielsbot beabsichtigt! 12.8k Ruf spricht für sich selbst über seine Fähigkeiten und macht diesen Zwei-Linien-Daemon. – user3069232

+0

Ich werde einige Kommentare hinzufügen :) – nielsbot

+0

Auch denke ich @Aaron Brager's Lösung ist allgemeiner in der gleichen Menge an Speicherplatz. – nielsbot

1

Ich glaube, Sie die cardsInCompartment als Arrays gespeichert werden sollen:

var cardsInCompartment = [0, 0] // you can add more to this array 

Dann können Sie einfach Schleife durch die cards und die Werte zu den Array-Elementen hinzufügen:

+0

Dies wird für jede Karte in _cards_ – nielsbot

+0

@nielsbot so was drucken? Aus dem gegebenen Zusammenhang, denke ich, wird er trotzdem alle Karten drucken. – Sweeper

+0

gut. Das ist das Original. scheint ungewollt. – nielsbot

0

Ich mag Aaron Brager Idee, die Werte in Wörterbuch zählt. Ich benutze reduzieren, um änderbare Wörterbuch außerhalb der "Schleife" (mehr funktionale) zu beseitigen

let d = cards.reduce([:]) { (d, card) -> [Int:Int] in 
    var d = d 
    let s = d[card.compartment] ?? 0 
    d[card.compartment] = s + 1 
    return d 
}