2015-06-26 18 views
-1

下面是一个教程中的类,我很努力地理解其中的语法。Swift:通过示例进行关闭和澄清

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. 接下来,我们terate column通过08的值,并且我们通过对row的迭代通过08将它嵌套。

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

这是我迷路的地方。

问题1:为什么我们叫中传递函数fn(location)location 64次传球的时候有什么回来?

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

问题3:速记$0的意思是只设置.Empty的第一个元素吗?

+0

这个问题太宽泛,无法标记为任何单个问题的重复... – nhgrif

回答

1

我的理解是这样的:

func cellVisitor(fn: (BoardLocation) ->())是一个被称为对64的每个字段功能,您可以通过一个封闭或做一个函数任何你喜欢的每一个领域。

cellVisitor { self [$0] = .Empty }将自己的每个元素设置为.Empty。

self[]由下标定义。方括号中的参数是特定的棋盘位置。

$ 0是从这里BoardLocation参数的快捷方式:fn: (BoardLocation) ->()

问题1:为什么我们要调用的函数fn(位置),这是 传递和传递位置64倍时,有什么到 返回?

对于那些64个位置的函数被调用,设置到.Empty元素

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

你基本上是这样做的: for each location in self[0...63] set location = .Empty

问题3:是否速记$ 0只意味着第一个元素设置为 .Empty?

$ 0是作为参数传递函数的第一个参数(以及唯一的参数)的简写。