Ben's Swift Programming Adventure[Journal]

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 :grin: :stuck_out_tongue_winking_eye:), 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 :laughing:!
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

Great job working through that bug!

Many parts of programming can be very tedious, gotta make sure you pay attention!