kangarooChris
kangarooChris

Reputation: 768

more elegant code for for if in swift

I got a simple code which works and which I am programming in and old fashioned way and I am sure there is a more elegant way of doing this in swift. Here is the code:

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

I basically got cards in different compartments and now I want to count how many cards are in each compartment.

Upvotes: 1

Views: 687

Answers (6)

user3441734
user3441734

Reputation: 17572

I like Aaron Brager's idea which counts values into dictionary. I am using reduce to eliminate mutable dictionary outside the 'loop' (more functional)

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
}

Upvotes: 0

nielsbot
nielsbot

Reputation: 16031

Or, use an Array to keep your counts:

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])")

(This assumes your only compartments are integers 1 and 2)

Upvotes: 0

user3069232
user3069232

Reputation: 8995

What about a switch statement? Something like this?

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

Upvotes: 0

Sweeper
Sweeper

Reputation: 272760

I think you should store the cardsInCompartment as arrays:

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

Then you can just loop through the cards and add the values to the array elements:

for card in cards {
    cardsInCompartment[card.compartment - 1] += 1
    print(cardsInCompartment[card.compartment - 1])
}

Upvotes: 1

Twitter khuong291
Twitter khuong291

Reputation: 11702

Try this:

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

Upvotes: 1

Aaron Brager
Aaron Brager

Reputation: 66292

How about using filter to select the cards you want? Then you can just count them:

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

If you have a bunch of compartments, you could store the counts in a dictionary:

var compartmentCounts = [Int:Int]()

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

In this case, the key would be the compartment#, and the value would be the card count. Something like [1: 32, 2: 42] if there are 32 and 42 cards in each respective compartment.

Upvotes: 3

Related Questions