Moment 1 - First Debug
Hi everyone
Recently, I have been working on Module 3 of Chris’s beginner course.
Yesterday I ran into a bug that made the view display 18 cards instead of 16.
Here’s the all the code with the bug:
import Foundation
class CardModel {
func getCards() -> [Card] {
// Declare an empty array
var generatedCards = [Card]()
// This is just for making sure that there are only 8 different numbers
var generatedNumbers = [Int]()
// Generate 8 pairs of cards
while generatedNumbers.count <= 8 {
// Generate a random Number
let randomNumber = Int.random(in: 1...13)
if generatedNumbers.contains(randomNumber) == false {
// Create 2 new card objects
let cardOne = Card()
let cardTwo = Card()
// Add the random number to the generated numbers list
generatedNumbers.append(randomNumber)
// Set their image names
cardOne.imageName = "card\(randomNumber)"
cardTwo.imageName = "card\(randomNumber)"
// Add them to the array
generatedCards += [cardOne, cardTwo]
}
}
// Randomize the cards within the array
generatedCards.shuffle()
print(generatedNumbers)
// Return the array
return generatedCards
}
}
I racked my head thinking of ways that I “achieved” this bug, I even did the latest coding challenge to help, but my code was the same as the one with the challenge(I figured out the challenge, but I don’t understand why the error would create 16, not any other number).
After spending about half an hour on it, I decided that I should leave this for the next day, so I can start with a fresh mind.
Unfortunately, in the morning I couldn’t work on it as I was busy with my school e-learning(yes, I’m still in school, I’m not even in middle school yet
), so I couldn’t work on the bug.
After a day of learning, I finally got time for debugging. This time I checked the while loop
very carefully, and noticed that it had <= 8
, I quickly realised that Swift is 0-based, which meant that <= 8
meant 9 times. I quickly fixed that mistake and debugged my first bug, ON MY OWN !
Turns out that “// This is just for making sure that there are only 8 different numbers” can actually mean 9 numbers.
Debugged code for ViewController.swift:
import Foundation
class CardModel {
func getCards() -> [Card] {
// Declare an empty array
var generatedCards = [Card]()
// This is just for making sure that there are only 8 different numbers
var generatedNumbers = [Int]()
// Generate 8 pairs of cards
while generatedNumbers.count <= 7 {
// Generate a random Number
let randomNumber = Int.random(in: 1...13)
if generatedNumbers.contains(randomNumber) == false {
// Create 2 new card objects
let cardOne = Card()
let cardTwo = Card()
// Add the random number to the generated numbers list
generatedNumbers.append(randomNumber)
// Set their image names
cardOne.imageName = "card\(randomNumber)"
cardTwo.imageName = "card\(randomNumber)"
// Add them to the array
generatedCards += [cardOne, cardTwo]
}
}
// Randomize the cards within the array
generatedCards.shuffle()
print(generatedNumbers)
// Return the array
return generatedCards
}
}
Ben