ios swfit 由继承UIButton了解类的构造方法
2015-04-15 10:46
288 查看
最近需要建立UIButton的子类。
先看一看swfit中继承父类构造方法的条件:
也就是说,如果你不在子类中实现任何designated 构造函数,就可以继承父类的所有designated 和 convience 构造函数。
再看一个复杂点的例子,这个例子是swfit的官方说明文档上的:
![](http://images.cnitblog.com/blog2015/493542/201504/151717004018881.png)
其中需要注意的就是第二个框中的内容
先看一看swfit中继承父类构造方法的条件:
Rule1 1 “If your subclass doesn’t define any designated initializers, it automatically inherits all of its superclass designated initializers. Rule 2 If your subclass provides an implementation of all of its superclass designated initializers—either by inheriting them as per rule 1, or by providing a custom implementation as part of its definition—then it automatically inherits all of the superclass convenience initializers.”
也就是说,如果你不在子类中实现任何designated 构造函数,就可以继承父类的所有designated 和 convience 构造函数。
再看一个复杂点的例子,这个例子是swfit的官方说明文档上的:
![](http://images.cnitblog.com/blog2015/493542/201504/151717004018881.png)
其中需要注意的就是第二个框中的内容
“The init(name: String) convenience initializer provided by RecipeIngredient takes the same parameters as the init(name: String) designated initializer from Food. Because this convenience initializer overrides a designated initializer from its superclass, it must be marked with the override modifier (as described in Initializer Inheritance and Overriding). Even though RecipeIngredient provides the init(name: String) initializer as a convenience initializer, RecipeIngredient has nonetheless provided an implementation of all of its superclass’s designated initializers. Therefore, RecipeIngredient automatically inherits all of its superclass’s convenience initializers too.” Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. https://itun.es/cn/jEUH0.l[/code]
这里可以看出,子类可以建立convinience 的构造方法去override 父类的designated 构造方法,也算实现了父类的designated 构造方法。
下面看具体的实验过程
1.先建立这个空的类,编译,无任何问题。class TestBtn: UIButton { }
2.继续添加class TestBtn: UIButton { init(){ } }
这次编译后,有以下截图
为什么我不写 init() 方法就不需要实现 init(coder aDecoder: NSCoder) 方法呢,这里就设计到了开始提到的构造函数继承问题,由于我们的子类没有designated 构造方法,那么我们所写的这一个init 方法就被系统当做了designated 构造方法,所以我们的类不能继承UIButton的任何构造方法,而nscoding协议又要求UIButton实现这个构造方法,所以出现了警告。
3.我们消除警告后,代码如下,继续编译class TestBtn: UIButton { init(){ } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
错误如下图
这个比较好理解,没有调用直接父类的designated 构造函数。
4. 更改代码如下,继续编译class TestBtn: UIButton { init(){ super.init() } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
错误如下
就是说UIButton的init方法并不是一个 designated 构造方法。
UIButton无自定义init方法,因此是继承与UIControl的,而UIControl也无自定义init,因此是UIView的,而UIView的只有一个
init(frame: CGRect),那么它一定是一个designated 构造函数!
正确的写法如下:class TestBtn: UIButton { init(){ super.init(frame: CGRectZero) } required init(coder aDecoder: NSCoder) { super.init(coder:aDecoder) } }
相关文章推荐
- 【iOS】Swift类的继承、构造方法、析构器等复习
- 【iOS】Swift类的继承、构造方法、析构器等复习
- 关于继承Fragment后重写构造方法而产生的错误
- JAVA基础--继承中的构造方法
- java之继承中的构造方法
- 重载、构造方法、继承、GUI
- 蓝鸥iOS从零基础到精通就业-OC语言入门 2继承和初始化方法4
- 继承 子类对父类方法的覆盖 构造方法的继承 super
- 第五章 类的继承和super的使用调用父类构造方法
- SJCP试题--JAVA继承时候的构造方法笔试面试总结
- iOS开发系列之常用自定义控件开发集—继承UIButton控件代码快速创建按钮开发
- 关于构造方法的继承
- iOS --- 为UIButton添加setBackgroundColor:forState:方法(包含OC和Swift两个版本)
- java中子类继承父类自动调用父类无参构造方法的问题
- C#高级(五)继承,派生类,派生类的构造方法
- 子类继承父类后,代码块和构造方法的运行先后的顺序
- iOS UIButton 等方法 按钮
- 继承的构造方法
- (教学思路 C#之类七)类和构造方法的继承(base关键字、Object类)
- Scala学习第十二天 Scala中的继承:超类的构造、重写字段、重写方法代码实战