Swift设置struct var基于另一个struct var(尝试过的init)

时间:2017-06-30 15:12:26

标签: swift struct

我已经阅读了一些关于访问struct成员中的struct成员的类似帖子,并尝试了一些他们的解决方案。如果您有其他不满意,请在downvoting之前发表评论。

我有一个 struct Grid 的扩展,需要访问 struct Cell {var state 的成员,以确定网格中有多少个单元存活。我的尝试被注释掉了。为什么我无法访问cell.state

extension Grid {
    var numLiving: Int {
        return positions(rows: self.rows, cols: self.cols).reduce(0) { total, position in
            // let myState = Cell.state()
            // return myState.isAlive ? (total + 1) : (total)
            // error: instance member 'state' cannot be used on type 'Cell'
        }
    }
}

Cell肯定有一个状态成员,其状态为enum:

struct Cell {
    var position: (Int,Int)
    var state: CellState

    init(_ position: (Int,Int), _ state: CellState) {
        self.position = (0,0)
        self.state = .empty
    }
}

enum CellState {
    case alive
    case empty
    case born
    case died

    var isAlive: Bool {
        switch self {
        case .alive, .born: return true
        case .empty, .died: return false
        }
    }
}

struct Grid {  
    var rows: Int = 10
    var cols: Int = 10
    var cells: [[Cell]] = [[Cell]]()

    init(_ rows: Int,
         _ cols: Int,
         cellInitializer: (Int, Int) -> CellState = { _,_ in .empty } ) {
            self.rows
            self.cols
            self.cells = [[Cell]](repeatElement([Cell](repeatElement(Cell((0,0), .empty), count: cols)),count: rows))

        positions(rows: rows, cols: cols).forEach { row, col in
            cells[row][col].position = (row, col)
            cells[row][col].state = .empty
}

2 个答案:

答案 0 :(得分:2)

这不是结构的工作方式。您正在尝试访问尚未创建的结构的实例变量。

您必须执行类似

的操作
var cell = Cell(...)

然后致电:

cell.state

在您的网格扩展程序中,您可能希望访问为游戏创建的所有单元格,然后从中获取状态。

答案 1 :(得分:1)

您需要使用positioncell媒体资源中访问您的特定cells,然后在isAlive {{1}上致电cell }}:

state

使用三元运算符可以更紧凑地编写:

var numLiving: Int {
    return positions(rows: self.rows, cols: self.cols).reduce(0) { total, position in
        if cells[position.0][position.1].state.isAlive {
            return total + 1
        } else {
            return total
        }
    }
}