1.今天晚上朋友问我是不是swift4.0中
convenience init() {
self.init()
}
这个方法在分类里面用不了了
我也是从2.0开始接触swift,3.0中才开始使用swift写项目
最后我创建了一个项目试了下,才发现这不是swift版本的问题,是以前没有去整理
class TextField: UITextField {
convenience init() {
self.init()
}
}
对于上面说的这种完全可以用,应为这是在子类里面相当于UITextField子类遍历构造函数
2.1
extension TextField{
convenience init() {
self.init()
}
}
这是在分类中,这样子也是可以的,也是相当于是UITextField子类的遍历构造函数
3.那么问题来了,他问的是什么呢?
extension UITextField{
convenience init() {
self.init()
}
}
这样子就不可以了,编译器会报
Initializer 'init()' with Objective-C selector 'init' conflicts with implicit initializer 'init()' with the same Objective-C selector
这样子的错误.看了我就懂了,我的理解是系统也会对UITextField有一个构造函数,这是OC的隐士转换的时候,专门位swift提供,那就是冲突了,所以直接在系统的分类里面如果不带参数的话就会有冲突错误.
测试多个,只要是关于对系统类直接在分类里面去布袋参数的实现遍历构造函数就会有这样子的问题
extension UIViewController{
convenience init() {
self.init()
}
}
3.1
extension UITextField{
convenience init(str:String) {
self.init()
}
}
如果带了参数的话,就不会有这样子的冲突问题.
网友评论