这不是一个var而不是let?

时间:2015-12-15 02:34:57

标签: swift

大家好,所以我对理解这段代码有一个问题:

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循环改变它的价值?或者每次创建和销毁?

4 个答案:

答案 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)

letvar,这取决于您使用它的范围。如果您想在相同范围内使用后更改值,则必须使用var。如果不是,您将使用let。当您运行此范围时,它将创建并结束范围,它将被销毁。