You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:36:03