Xcode 13编译自定义UIView的convenience init出现矛盾报错问题咨询
问题原因说明
1. 代码本身的逻辑缺陷
你当前的代码存在原生的初始化器冲突:
- 已经定义了重写父类的指定初始化器
override init(frame: CGRect) - 又额外定义了签名完全相同的便利初始化器
convenience init(frame: CGRect)
同一个类中不允许存在两个方法签名完全一致的初始化器,且你写的便利初始化器内部调用self.init(frame: frame)会触发无限递归,本身就是无效代码。
2. Xcode版本差异的根本原因
- Xcode 12 内置的 Swift 编译器版本(5.4及更早)存在检查漏洞,没有识别到同签名指定/便利初始化器的冲突问题,所以不会触发报错
- Xcode 13 配套的 Swift 5.5 及更高版本补全了这项语法检查,所以会抛出冲突提示
3. 两个矛盾报错的产生逻辑
两个报错是编译器按先后检查规则输出的结果,并不矛盾:
- 第一步检查到便利初始化器
init(frame: CGRect)和父类UIView的同签名初始化器匹配,因此提示需要添加override关键字 - 第二步检查到你已经定义了一个同签名的
override init(frame: CGRect)指定初始化器,因此提示该方法已经被重写,不允许重复定义
4. 修复方案
直接删除多余的convenience init(frame: CGRect)即可,如果你需要额外的便利初始化入口,修改为和指定初始化器不同的签名即可,示例:
// 正确的便利初始化器示例,签名和指定初始化器做区分 convenience init(frame: CGRect, defaultOptions: [String]) { self.init(frame: frame) // 额外配置逻辑 }
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

