我已经阅读了一些关于访问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
}
答案 0 :(得分:2)
这不是结构的工作方式。您正在尝试访问尚未创建的结构的实例变量。
您必须执行类似
的操作var cell = Cell(...)
然后致电:
cell.state
在您的网格扩展程序中,您可能希望访问为游戏创建的所有单元格,然后从中获取状态。
答案 1 :(得分:1)
您需要使用position
从cell
媒体资源中访问您的特定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
}
}
}