ios swfit 由继承UIButton了解类的构造方法
最近需要建立UIButton的子类。
先看一看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的官方说明文档上的:

其中需要注意的就是第二个框中的内容
“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
这里可以看出,子类可以建立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 swfit 由继承UIButton了解类的构造方法的更多相关文章
- 小白学开发(iOS)OC_ 使用继承来扩充类(2015-08-07)
// // main.m // 使用继承来扩充类 // // Created by admin on 15/8/12. // Copyright (c) 2015年 admin. All ri ...
- iOS学习——UI基础UIButton(七)
前面写了UIWindow.UIViewController,那些都是一些框架,框架需要填充上具体的view才能组成我们的应用,移动应用开发中UI占了很大一部分,最基础的UI实现是使用系统提供的各种控件 ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
- IOS之UI -- 按钮UIButton的细节
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- ios学习总结(2) -- UIButton的使用
原文地址 UIButton的类是一个UIControl子类,它实现了在触摸屏上的按钮.触摸一个按钮拦截事件和动作消息发送到目标对象时,它的挖掘.设定的目标和行动方法都继承自UIControl.这个类提 ...
- iOS 分类和继承
iOS 中分类(Categories) 和 继承(Inherit)有相同的功能,但在一些细节上又有差异,简单介绍一下两者的异同. 分类可以在不知道系统类源代码的情况下,为这个类添加新的方法.分类只能用 ...
- iOS开发笔记系列-基础2(类)
面向对象编程总是离不开类和对象的,Objective-C也不例外,不过Objective-C中的类还有一些自己的独特点. 类的声明和定义 在iOS开发中,类的声明与定义通常都是分开的,类得声明通常存放 ...
- iOS View自定义窍门——UIButton实现上显示图片,下显示文字
“UIButton实现上显示图片,下显示文字”这个需求相信大家在开发中都或多或少会遇见.比如自定义分享View的时候.当然,也可以封装一个item,上边imageView,下边一个label.但是既然 ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
随机推荐
- Double和double的区别
1.Double是java定义的类,而double是预定义数据类型(8种中的一种)2.Double就好比是对double类型的封装,内置很多方法可以实现String到double的转换,以及获取各种d ...
- fopen()和fclose()的用法
fopen()和fclose()的用法 1.fopen()函数的用法 fopen函数用于打开文件, 其调用格式为: FILE *fopen(char *filename, *type); fopen( ...
- Hibernate 应用
完善的持久化层应该达到以下目标: 1.代码可重用性高,能够完成所有的数据库访问操作. 2.如果有需要的话,能够支持多种数据库平台. 3.具有相对独立性,当持久化层的实现发生变化,不会影响上层的实现. ...
- Struts2验证框架实例
今天写了个Struts验证框架的实例,总算把验证框架弄清楚了. 上一篇Struts实例的action没有继承ActionSupport类,虽然也可以实现action的功能,但是却不能应用Struts提 ...
- Linux下的特殊权限SetUID
1.SetUID的功能 只有可以执行的二进制程序才能设置SUID权限 命令执行者要对改程序拥有x执行权限 命令执行者在执行改程序的时候获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属性) ...
- php正则表达式匹配用户名规则:由字母开头的6-16位字母和数字组成的字符串
$pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9]{5,15}$/i';
- 2013长沙赛区现场赛 J - Josephina and RPG
J - Josephina and RPG Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I6 ...
- Spak之开发代码 _pom 配置
1.spark on yarn import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ /** * Cr ...
- vue.js 简单入门
转载自:http://blog.csdn.net/violetjack0808/article/details/51451672 <!DOCTYPE html> <html lang ...
- mongodb windows install &python
安装mongo http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/ 其中修改: echo logpath=C:\mo ...