大家好,所以我对理解这段代码有一个问题:
struct Point {
// Passing in values
// X = 1
let x: Int
// y = 1
let y: Int
func surroundingPoints(withRange range: Int = 1) -> [Point] {
var results: [Point] = []
for xCoord in (x-range)...(x+range) {
for yCoord in (y-range)...(y+range) {
let coordinatePoint = Point(x: xCoord, y: yCoord)
results.append(coordinatePoint)
print(coordinatePoint)
}
}
return results
}
}
// Creating an instance and assigning to a constant called coordinatePoint
let coordinatePoint = Point(x: 1, y: 1)
print(coordinatePoint)
// Calling the function inside Point instance
coordinatePoint.surroundingPoints()
print(coordinatePoint)
不应该
let coordinatePoint = Point(x: xCoord, y: yCoord)
是var而不是let?因为它每次围绕for循环改变它的价值?或者每次创建和销毁?
答案 0 :(得分:4)
每次都会创建和销毁变量,因此任何一个都可以正常工作。如果您在for循环之上定义了coordinatePoint
,那将是一个不同的故事。在这种情况下,您必须使用var
。
答案 1 :(得分:1)
否 - 循环内的coordinatePoint本地作用于该内循环。它在打印后不再直接存在,并在下一次迭代时重新创建。
答案 2 :(得分:1)
没有。创建coordinatePoint
,然后在for循环的每次迭代中销毁一次。 (它的作用域仅限于在其中声明的for循环。)这就像每次调用函数时一样,函数中的局部变量将被创建和销毁。
如果你想使用var而不是let,那么你可以在for循环的范围之外声明它,如下所示:
func surroundingPoints(withRange range: Int = 1) -> [Point] {
var results: [Point] = []
var coordinatePoint: Point
for xCoord in (x-range)...(x+range) {
for yCoord in (y-range)...(y+range) {
coordinatePoint = Point(x: xCoord, y: yCoord)
results.append(coordinatePoint)
print(coordinatePoint)
}
}
return results
}
现在coordinatePoint
仅在每次调用方法时创建一次。然而,这样做并没有特别的优势,从风格的角度来看,使用let可能是最好的。
答案 3 :(得分:0)
let
或var
,这取决于您使用它的范围。如果您想在相同范围内使用后更改值,则必须使用var
。如果不是,您将使用let
。当您运行此范围时,它将创建并结束范围,它将被销毁。