Swift中的required修饰符
2016-06-14 16:41
423 查看
func lainxi() {
//1.首先定义一个基类,一说到required修饰符,我们最先想到的应该就是普通类(class)的init()方法了
class MyClass {
var str:String
init(str:String) {
self.str = str
}
}
//2.定义一个MyClass 的子类 MySubClass
class MySubClass:MyClass {
}
let a1 = MySubClass(str:"Hello Swift")//继承了它父类
print(a1.str)//Hello Swift
class MySubClass2:MyClass {
override init(str:String)
{//init()方法前加上override修饰符,表示MySubClass重写了其父类的init()方法,然后还要调用父类的init()方法,并将参数一并传给父类的方法
super.init(str:str)
}
}
let a2 = MySubClass2(str:"Hello Swift")
print(a2.str)////Hello Swift
/*应用:
** 比如 子类化的时候需要自定义初始化方法
*/
class MySubClass3:MyClass
{
//当子类的初始化方法参数类型与父类的初始化方法参数类型不同时,我们就不必在子类的初始化方法前加override修饰符了
//但是要把子类初始化方法的参数类型转换为符合父类初始化方法的参数类型,然后传给父类的初始化方法
init(i:Int) {
super.init(str:String(i))
}
}
let a3 = MySubClass3(i: 10)
//required修饰符
//给父类的init()方法加上required修饰符
class SomeClass {
var str:String
required init(str:String) {
self.str = str
}
}
// class SomeSubClass:SomeClass
// {
// init(i:Int) {
// super.init(str:String(i))
// }
//
// // 编译错误 上面的代码在编译会发生错误,因为我们没有实现父类中要去必须要实现的方法
// }
class SomeSubClass:SomeClass {
required init(str:String) {
super.init(str: str)
}
// required init(str: String) {
// fatalError("init(str:) has not been implemented")
// }
init(i:Int) {
super.init(str:String(i))
}
}
//从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override。
//如果子类中不需要添加任何初始化方法,我们则可以忽略父类的required初始化方法:
/*
**
required修饰符的使用规则
required修饰符只能用于修饰类初始化方法。
当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
当子类没有初始化方法时,可以不用实现父类的required初始化方法。
*/
let a4 = SomeSubClass(i: 10)
}
/*
** 应用:
* 比如:在子类化视图的时候 重写初始化方法的时候需要:
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
这也是解释重写初始化方法的时候 不写上面的方法会提示错误的原因
*/
//1.首先定义一个基类,一说到required修饰符,我们最先想到的应该就是普通类(class)的init()方法了
class MyClass {
var str:String
init(str:String) {
self.str = str
}
}
//2.定义一个MyClass 的子类 MySubClass
class MySubClass:MyClass {
}
let a1 = MySubClass(str:"Hello Swift")//继承了它父类
print(a1.str)//Hello Swift
class MySubClass2:MyClass {
override init(str:String)
{//init()方法前加上override修饰符,表示MySubClass重写了其父类的init()方法,然后还要调用父类的init()方法,并将参数一并传给父类的方法
super.init(str:str)
}
}
let a2 = MySubClass2(str:"Hello Swift")
print(a2.str)////Hello Swift
/*应用:
** 比如 子类化的时候需要自定义初始化方法
*/
class MySubClass3:MyClass
{
//当子类的初始化方法参数类型与父类的初始化方法参数类型不同时,我们就不必在子类的初始化方法前加override修饰符了
//但是要把子类初始化方法的参数类型转换为符合父类初始化方法的参数类型,然后传给父类的初始化方法
init(i:Int) {
super.init(str:String(i))
}
}
let a3 = MySubClass3(i: 10)
//required修饰符
//给父类的init()方法加上required修饰符
class SomeClass {
var str:String
required init(str:String) {
self.str = str
}
}
// class SomeSubClass:SomeClass
// {
// init(i:Int) {
// super.init(str:String(i))
// }
//
// // 编译错误 上面的代码在编译会发生错误,因为我们没有实现父类中要去必须要实现的方法
// }
class SomeSubClass:SomeClass {
required init(str:String) {
super.init(str: str)
}
// required init(str: String) {
// fatalError("init(str:) has not been implemented")
// }
init(i:Int) {
super.init(str:String(i))
}
}
//从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override。
//如果子类中不需要添加任何初始化方法,我们则可以忽略父类的required初始化方法:
/*
**
required修饰符的使用规则
required修饰符只能用于修饰类初始化方法。
当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
当子类没有初始化方法时,可以不用实现父类的required初始化方法。
*/
let a4 = SomeSubClass(i: 10)
}
/*
** 应用:
* 比如:在子类化视图的时候 重写初始化方法的时候需要:
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
这也是解释重写初始化方法的时候 不写上面的方法会提示错误的原因
*/
相关文章推荐
- 在PHP中使用curl_init函数的说明
- 详解Python中的__init__和__new__
- python中的__init__ 、__new__、__call__小结
- jQuery构造函数init参数分析
- 深入剖析Android中init进程实现的C语言源码
- php运行出现Call to undefined function curl_init()的解决方法
- Python中的__new__与__init__魔术方法理解笔记
- Python version 2.7 required, which was not found in the registry
- Python中__init__和__new__的区别详解
- Python类方法__init__和__del__构造、析构过程分析
- Linux启动顺序简要记录
- Android系统学习总结1--init和Zygote
- Systemd 进程管理相关
- service redis does not support chkconfig的解决办法
- PHP 5.2+ is required
- new 和 alloc init的区别
- 由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起
- django mongodb init install
- Debian的init进程初始化工作原理
- 两个init方法的区别