Swift中如何正确调用类方法完成类属性初始化?
Swift 类属性初始化问题修复方案
你原代码的问题在于:类属性声明阶段直接调用实例方法createBoard()时,类实例还未完成初始化,height、width两个属性还没有赋值,实例方法也无法在实例初始化完成前被调用,因此无法满足你的需求。
方案1:在init方法中完成board赋值(推荐)
调整属性初始化顺序,先完成基础属性赋值,再调用方法生成棋盘:
class Game { var height: Int var width: Int // 仅声明属性,暂不赋值 var board: [[String]] init(height: Int, width: Int) { self.height = height self.width = width // 基础属性赋值完成后,再调用方法生成board self.board = createBoard() } private func createBoard() -> [[String]]{ var gameBoard: [[String]] = [] // 这里可正常读取height、width完成棋盘填充,下方是示例逻辑 for _ in 0..<height { let row = Array(repeating: " ", count: width) gameBoard.append(row) } return gameBoard } }
该方案优势是初始化逻辑清晰,所有属性都在init阶段完成赋值,后续如果需要修改宽高重新生成棋盘,也可以手动调用createBoard()重新赋值给board。
方案2:使用lazy懒加载属性
如果你的board不需要在初始化阶段立刻完成赋值,可以用lazy修饰,它会在第一次被访问时才执行赋值逻辑,此时实例已经初始化完成,宽高属性已有有效值:
class Game { var height: Int var width: Int // lazy修饰后,赋值逻辑第一次访问时才执行 lazy var board: [[String]] = createBoard() init(height: Int, width: Int) { self.height = height self.width = width } private func createBoard() -> [[String]]{ var gameBoard: [[String]] = [] // 同样可正常读取height、width for _ in 0..<height { let row = Array(repeating: " ", count: width) gameBoard.append(row) } return gameBoard } }
注意:lazy属性必须用var声明,赋值逻辑仅会在第一次访问时执行一次,如果后续修改了height或width,board不会自动同步更新。
内容的提问来源于stack exchange,提问作者Iven99
相关产品推荐
相关产品推荐

