Welcome to the Treehouse Community
Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.
Looking to learn something new?
Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.
Start your free trialJames Josephson
1,180 PointsWhat's not working here?
When I copy paste into a playground the code compiles, but in browser Treehouse says it can't compile but provides no error message in output. I ran a few print tests on this in my playground and it seemed to produce the right functionality.
class Point {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class Machine {
var location: Point
init() {
self.location = Point(x: 0, y: 0)
}
func move(direction: String) {
print("Do nothing! I am a machine!")
}
}
// Enter your code below
class Robot: Machine {
override init() {
super.init()
}
override func move(direction: String) {
switch direction {
case "Up": location.y += 1
case "Down": location.y -= 1
case "Left": location.x -= 1
case "Right": location.x += 1
default: print("Plese enter a valid direction")
}
}
}
4 Answers
andren
28,558 PointsThe problem is that you have (accidentally?) changed a part of the code you were not meant to touch. The move
method that you are overriding has a _ as an external parameter name when the challenge loads, but in your code that has been removed.
If you add it back and also add it to the overridden method (since they have to be identical) like this:
class Point {
var x: Int
var y: Int
init(x: Int, y: Int) {
self.x = x
self.y = y
}
}
class Machine {
var location: Point
init() {
self.location = Point(x: 0, y: 0)
}
func move(_ direction: String) { // Added _ as external parameter name
print("Do nothing! I am a machine!")
}
}
// Enter your code below
class Robot: Machine {
override init() {
super.init()
}
override func move(_ direction: String) { // Added _ as external parameter name
switch direction {
case "Up": location.y += 1
case "Down": location.y -= 1
case "Left": location.x -= 1
case "Right": location.x += 1
default: print("Plese enter a valid direction")
}
}
}
Then the code will be accepted.
Patrick Duhamel
5,786 PointsWhen you override a function, it must match the signature of the original function in the code presented in the recap, which means that the function move doesn't have an external parameter with the symbol _
func move(_ direction: String) {...} , so your code needs to match it by writing it as
override function move(_ direction: String) {...}
James Josephson
1,180 PointsOkay got it, thanks for the help! Does the parameter _ have some significance, either functionally or conventionally?
andren
28,558 PointsIt does actually have some functional significance. It makes it so that you can call the function/method without having to specify a parameter name as you normally would. Take this function:
func addTwoNumbers(num1: Int, num2: Int) -> Int {
return num1 + num2
}
The name of the function makes it pretty obvious what the two arguments are meant to be, so having to specify the parameter labels when calling the function like this:
addTwoNumbers(num1: 5, num2: 10)
Is a bit unnecessary since it doesn't really make the code any easier to read, which is partly why parameter labels exist in the first place. For situations like this Swift allows you make it so that you can call the function without specifying parameter names, and that is done with the _ external parameter name.
So if the function looked like this:
func addTwoNumbers(_ num1: Int, _ num2: Int) -> Int {
return num1 + num2
}
Then you could call it without specifying any labels like this:
addTwoNumbers(5, 10)
James Josephson
1,180 PointsGreat, thank you! That clears it up.