Welcome to the Treehouse Community

The Treehouse Community is a meeting place for developers, designers, and programmers of all backgrounds and skill levels to get support. Collaborate here on code errors or bugs that you need feedback on, or asking for an extra set of eyes on your latest project. Join thousands of Treehouse students and alumni in the community today. (Note: Only Treehouse students can comment or ask questions, but non-students are welcome to browse our conversations.)

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and a supportive community. Start your free trial today.

iOS Build a Vending Machine App in Swift 2.0 Using the Vending Machine Modeling the Vending Machine

Ilhyun Jo
Ilhyun Jo
6,288 Points

What was the point of using guard to check item quantity. Wouldn't a if statement be more fitting?

I thought guard statements were used to unwrap optionals so the first guard statement was understandable but the second one seemed unreasonable since there was no optional to unwrap.

guard item.quantity > quantity else { throw VendingMachineError.OutOfStock }

if item.quantity < quantity { throw VendingMachineError.OutOfStock }

2 Answers

Greg Kaleka
Greg Kaleka
39,018 Points

The advantage of guard is that if the criteria isn't met, the code will leave the current scope. If you use if, the code will run through the inside of the if statement, and then continue with the rest of the code in the current scope, which you might not want. Here's an example.

func giveOutItems {

    guard item.quantity > quantity else {
        throw VendingMachineError.OutOfStock
    } // if we go into the guard statement, we won't continue after this line

    charge(item, quantity) // we don't want to do this if there's an error!
}

If we'd used an if statement, the error would have been thrown, and then the vending machine would have charged the customer for the full price anyway! There are other ways around this without using guard, but guard is simpler in many cases.

Hope this helps!

-Greg

Ilhyun Jo
Ilhyun Jo
6,288 Points

Thanks your explanation made things clear!

James Estrada
seal-mask
.a{fill-rule:evenodd;}techdegree
James Estrada
Full Stack JavaScript Techdegree Student 25,862 Points

What's the difference if I use an if-else statement?

if item.quantity < quantity {
   throw VendingMachineError.OutOfStock
} else {
   charge(item, quantity)
}

The top-voted answer is simply untrue. A throw statement will immediately transfer program control out of the current method. Any statements following the throw statement will not be executed. To achieve the same logic in the video using an if-statement, you can invert the condition:

if item.quantity <= 0 {
    throw VendingMachineError.OutOfStock
}