用方法初始化类属性的正确方法



我在Swift中玩一个小游戏,但我一直在用类方法初始化属性。

class Game {
var height: Int
var width: Int
var board: [[String]] = createBoard()

init(height: Int, width: Int) {
self.height = height
self.width = width
}
func createBoard() -> [[String]]{
var gameBoard: [[String]] = []
//working with width and height props from above
//filling the board and returning
return gameBoard
}
}

如何设置函数createBoard的板值?(内部创建板,我正在处理高度和宽度(

懒惰地创建属性。

好处是在第一次读取属性之前不会执行关闭

class Game {
var height: Int
var width: Int
lazy var board: [[String]] = {
var gameBoard: [[String]] = []
//working with width and height props from above
//filling the board and returning
return gameBoard
}()

init(height: Int, width: Int) {
self.height = height
self.width = width
}
}

正如@vadian所说,懒惰是一种很好的方法。但我想添加一些东西。

我认为你需要将你的heightwidth设为私有,以防止从外部更改它们,懒惰块将被调用一次,如果你将例如height从10更改为100,则不会调用你的板计算。如果你需要在初始化后更改你的游戏设置,所以我会建议另一个选项来做。

class Game {
var height: Int {
didSet {
board = self.updateGameBoard(height: height,
width: width)
}
}
var width: Int {
didSet {
board = self.updateGameBoard(height: height,
width: width)
} 
}

lazy var board: [[String]] = {
return updateGameBoard(height: height, width: width)
}()

init(height: Int, width: Int) {
self.height = height
self.width = width
}
private func updateGameBoard(height: Int, 
width: Int) -> [[String]] {
var gameBoard: [[String]] = []
//working with width and height props from above
//filling the board and returning
return gameBoard
}
}

这将允许您通过更改heightwidth从外部更改更新板反应

最新更新