2015-12-15 68 views
2

嗨,大家好,所以我有理解這個代碼的問題:這不是一個var而不是let?

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) 

是一個變種,而不是一個讓?因爲它每次都在for循環中改變它的值?還是每次創建和銷燬?

回答

4

該變量每次創建和銷燬,所以要麼工作得很好。如果你在for循環上面定義了coordinatePoint,那將是一個不同的故事。在這種情況下,您將不得不使用var

+0

謝謝!我懷疑可能是這種情況,但我並不完全確定。那麼在循環內創建的變量和常量會在每個循環完成後被銷燬? –

+0

是的。循環的每次迭代都獨立於前一個循環,除了循環修改某些在自身之外聲明的內容。 –

+0

@TomWayne,是的,這是它的意圖。儘管如此,不要在性能方面考慮它,因爲編譯器允許對其「聰明」。 – zneak

0

letvar,這取決於你將使用它的範圍。如果您想在同一範圍內使用後更改值,則必須使用var。如果沒有,您將使用let。當你運行這個作用域時,它會創建並結束它將被銷燬的作用域。

1

否 - 座標循環內的座標點局部限定在該內部循環中。它在打印後不再直接存在,並在下一次迭代中重新創建。

1

編號coordinatePoint被創建,然後在for循環的每次迭代中被銷燬一次。 (它的範圍僅限於它在內部聲明的for循環。)這就像每次調用函數時函數中的局部變量將被創建和銷燬一次。 如果你想使用一個變種,而不是放開,那麼你會聲明如下的範圍之外的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可能更可取。

相關問題