以下是我正在努力理解语法的教程中的一个类。
import Foundation
class Board {
private var cells: [BoardCellState]
let boardSize = 8
init () {
cells = Array(count: boardSize * boardSize,
repeatedValue: BoardCellState.Empty)
}
subscript(location: BoardLocation) -> BoardCellState {
get {
assert(isWithinBounds(location), "row or column index out of bounds")
return cells[location.row * boardSize + location.column]
}
set {
assert(isWithinBounds(location), "row or column index out of bounds")
cells[location.row * boardSize + location.column] = newValue
}
}
subscript(row: Int, column: Int) -> BoardCellState {
get {
return self[BoardLocation(row: row, column: column)]
}
set {
self[BoardLocation(row: row, column: column)] = newValue
}
}
func isWithinBounds(location: BoardLocation) -> Bool {
return location.row >= 0 && location.row < boardSize &&
location.column >= 0 && location.column < boardSize
}
func cellVisitor(fn: (BoardLocation) ->()) {
for column in 0..<boardSize {
for row in 0..<boardSize {
let location = BoardLocation(row: row, column: column)
fn(location)
}
}
}
func clearBoard() {
cellVisitor { self[$0] = .Empty }
}
}
我需要最后两个功能的帮助:
func cellVisitor(fn: (BoardLocation) ->()) {
for column in 0..<boardSize {
for row in 0..<boardSize {
let location = BoardLocation(row: row, column: column)
fn(location)
}
}
}
func clearBoard() {
cellVisitor { self[$0] = .Empty }
}
我的理解:
cellVisitor
接受一个接受BoardLocation
实例并返回void
接下来,我们通过column
到0
的值迭代8
,我们将其嵌套,并通过0
到8
进行迭代为row
。
这意味着使用组合循环,我们将调用函数fn(location)
64次。
这是我迷失的地方。
问题1 :为什么我们调用传入的函数fn(location)
并在没有任何内容返回时传入location
64次?
问题2 :我真的不明白cellVisitor { self [$0] = .Empty }
的目的。 .Empty
是来自0
的值struct
。
问题3 :简写$0
是否只设置.Empty
的第一个元素?
答案 0 :(得分:1)
我的理解是:
func cellVisitor(fn: (BoardLocation) ->())
是为64的每个字段调用的函数。您可以传递一个闭包或函数,为每个字段执行任何您喜欢的操作。
cellVisitor { self [$0] = .Empty }
将自我的每个元素设置为.Empty。
self[]
由下标定义。方括号中的参数是特定的电路板位置。
$ 0是此处BoardLocation参数的快捷方式:fn: (BoardLocation) ->()
问题1:为什么我们调用函数fn(location) 当没有任何东西时,传入并传入64次 返回?
对于这64个位置,调用一个函数将元素设置为.Empty
问题2:我不太了解cellVisitor的目的{ 自我[$ 0] = .Empty}。 .Empty是结构中的值0。
你基本上是这样做的:
for each location in self[0...63] set location = .Empty
问题3:速记$ 0是否仅设置第一个元素 .Empty?
$ 0是作为参数传递的函数的第一个(也是唯一的)参数的简写。