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

使用Xcode9开发Swift扫雷时SquareButton初始化报错求助

解决SquareButton初始化参数不匹配的错误

嘿,我之前也碰到过类似的坑,咱们一步步来捋清楚问题:

这个错误本质是说你调用SquareButton初始化器时,传入的参数和类本身定义的初始化器签名完全对不上,最常见的原因有这几个:

1. 你传了Square类型本身,而非它的实例

大概率你调用初始化器的时候写了类似这样的代码:

// 错误示例:传了Square.self(类型)而不是Square实例
let button = SquareButton(squareModel: Square.self, squareSize: 40)

而你的SquareButton初始化器定义里,squareModel参数要求的是Square的实例,比如:

class SquareButton: UIButton {
    var squareModel: Square
    
    init(squareModel: Square, squareSize: CGFloat) {
        self.squareModel = squareModel
        super.init(frame: CGRect(x: 0, y: 0, width: squareSize, height: squareSize))
        // 其他按钮配置代码
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

解决办法:先创建一个Square的实例,再把这个实例传进去:

// 先根据Square的初始化要求创建实例(比如传入位置、是否有雷等参数)
let mySquare = Square(row: 0, col: 0, isMine: false)
// 再初始化按钮
let button = SquareButton(squareModel: mySquare, squareSize: 40)

2. 参数名/类型不匹配

还有可能是你调用时的参数名和初始化器定义的不一样,比如教程里的初始化器参数名是square:,但你定义成了squareModel:,或者反过来。另外也要检查squareSize的类型——如果你的初始化器要求CGFloat,但你传了Int(比如40而不是40.0),虽然Swift通常会自动转换,但偶尔也会触发这类错误。

3. 初始化器定义本身有问题

如果你是自己写的SquareButton初始化器,要确保:

  • 所有存储属性(比如squareModel)在调用super.init之前已经完成初始化
  • 初始化器的参数列表和你调用时传的完全对应(包括可变参数如果有的话)

给你一个完整的正确示例参考:

// 假设Square类的定义是这样的
class Square {
    var row: Int
    var col: Int
    var isMine: Bool
    
    init(row: Int, col: Int, isMine: Bool) {
        self.row = row
        self.col = col
        self.isMine = isMine
    }
}

// SquareButton的正确初始化器
class SquareButton: UIButton {
    var squareModel: Square
    
    init(squareModel: Square, squareSize: CGFloat) {
        self.squareModel = squareModel
        // 先初始化自己的属性,再调用父类初始化
        super.init(frame: CGRect(origin: .zero, size: CGSize(width: squareSize, height: squareSize)))
        
        // 这里可以加按钮的样式配置,比如背景色、字体等
        self.backgroundColor = .lightGray
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

// 正确的调用方式
let testSquare = Square(row: 1, col: 1, isMine: false)
let testButton = SquareButton(squareModel: testSquare, squareSize: 44.0)

按照这个思路调整你的代码,应该就能解决这个初始化错误了。

内容的提问来源于stack exchange,提问作者Wiranek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:36:13