斯威夫特:通过例子结束和澄清

时间:2015-06-26 00:32:11

标签: swift closures

以下是我正在努力理解语法的教程中的一个类。

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 }
    }

我的理解:

  1. cellVisitor接受一个接受BoardLocation实例并返回void

  2. 的函数
  3. 接下来,我们通过column0的值迭代8,我们将其嵌套,并通过08进行迭代为row

  4. 这意味着使用组合循环,我们将调用函数fn(location) 64次。

  5. 这是我迷失的地方。

    问题1 :为什么我们调用传入的函数fn(location)并在没有任何内容返回时传入location 64次?

    问题2 :我真的不明白cellVisitor { self [$0] = .Empty }的目的。 .Empty是来自0的值struct

    问题3 :简写$0是否只设置.Empty的第一个元素?

1 个答案:

答案 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是作为参数传递的函数的第一个(也是唯一的)参数的简写。