使用Xcode9开发Swift扫雷时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
相关产品推荐
相关产品推荐

