浅谈swift中的那些类,结构以及初始化的操作
2015-11-16 20:59
225 查看
首先呢,我们先声明一个类
然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new一个的话,直接调用该类就可以了)
调用parent的方法和属性
par.m()
//在控制台显示的是Parentm
par.p1
//在控制台显示的是5
好了,这就是我们常用的class的定义以及方法(属性)的调用
接下来呢,我们要学习swift中关于父类的继承
我们就拿上面的那个Parent当作父类,我们先写一个子类来继承该父类,如果想
重写父类的属性或者方法时,一定要加一个override关键字
调用子类的属性
如果要继承一个父类的话,得先注意以下几点要求
1.重写父类的存储属性后可以给它加观察者(新功能)
2.可以把其改为计算属性(但是不能减少其功能)
3.父类的只读(只有get,或者let),子类不能添加观察者
****************************
类和结构体是人们构建代码所用的一种通用且灵活的构造体。为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法。
与其他编程语言所不同的是,Swift并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。
注意:通常一个类的实例被称为对象。然而在Swift中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。
classParent{ //声明一个属性 varp1:String="abc" //声明一个方法 funcm(){ print("parentm") } //声明一个静态的方法 finalfuncn(){ } }
然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new一个的话,直接调用该类就可以了)
varpar=Parent()
调用parent的方法和属性
好了,这就是我们常用的class的定义以及方法(属性)的调用
接下来呢,我们要学习swift中关于父类的继承
我们就拿上面的那个Parent当作父类,我们先写一个子类来继承该父类,如果想
重写父类的属性或者方法时,一定要加一个override关键字
classChild:Parent{ //重写父类的属性或者方法时,一定要加一个override关键字 //因为这里定义的父类属性是存储属性,所以如果要重写父类的话,就要把p1变成一个计算 //属性 overridevarp1:String{ get{ return"dasdf" } set{ } } overridefuncm(){ print("childm") }
调用子类的属性
varpar1:Parent=Child1() print("dfdfd\(par1.p1)") //显示的是dfdfddasdf
如果要继承一个父类的话,得先注意以下几点要求
1.重写父类的存储属性后可以给它加观察者(新功能)
2.可以把其改为计算属性(但是不能减少其功能)
3.父类的只读(只有get,或者let),子类不能添加观察者
****************************
类和结构体是人们构建代码所用的一种通用且灵活的构造体。为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法。
与其他编程语言所不同的是,Swift并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。
接下来呢,我们就讲一下关于swift中的class和struts有什么共同点和不同点
Swift中类和结构体有很多共同点。共同处在于:
定义属性用于储存值
定义方法用于提供功能
定义下标用于通过下标语法访问值
定义初始化器用于生成初始化值
通过扩展以增加默认实现的功能
符合协议以对某类提供标准功能
与结构体相比,类还有如下的附加功能:
继承允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
取消初始化器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用
*******************************
初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程
初始化的主要目的:对内部的存储属性赋值
结构:如果不自己添加初始化,会自动添加默认init和memberwiseinit
//这里定义了一个struct,
structPoint3{
varx:Int=1
vary:Int=2
//在这里呢,我们有必要说明一个构造函数(init)的几个要点
//1.一般来说,要写一个很全的构造函数,可以初始化所有的成员(特定的初始化器)
//2.可以写多个init,但必须要调用一个很全的构造函数
init(xx:Int){
self.init(xx:xx,yy:1)
}
init(yy:Int){
//x=1
//y=yy
self.init(xx:1,yy:yy)//self是不能省略的
}
//写一个很全的构造函数,可以初始化所有的成员
init(xx:Int,yy:Int){
x=xx
y=yy
}
}
在上面我们有说到struct与class的不同,class不会自己添加一个初始化,必须自己添加
黄金规则1:实例化之后所有的存储属性必须有值(两种方法赋值)
1.专门(特定)的初始化器designatedinitiliazer赋值,作用是给本类的所有存储属性赋值
2.在变量(常量)后面直接赋值
class的专门初始化器:
1.可以有多个
2.互相不能调用,每一个负责实现所有本类存储属性的初始化
3.负责处理继承过来的存储属性的初始化。
3.1相信别人,所以表现就是调用父类的特定初始化器(不能
调用父类的便利初始化器)
便利的初始化器:
1.可以有多个
2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器
3.最终一定是调用本类的特定初始化器
//作用:1.给本类的所有存储属性赋值
classAA{
varm:Int
varn:Int
//特定的初始化器
init(mm:Int,nn:Int){
m=mm
n=nn
}
init(){
m=111
n=22
//这里会报错,表明特定的init之间不能相互调用
//所以建议:实际每个类只写一个特定的初始化器
//self.init(mm:111,nn:222)
}
//便利的初始化器需要调用专门的初始化器(直接或间接都可以)
convenienceinit(mm:Int){
self.init(mm:mm,nn:1)
}
convenienceinit(nn:Int){
//self.init(mm:1,nn:2)
self.init(mm:nn)
}
}
再然后呢,我们再看一段代码,如何通过子类来实现父类的初始化工作
classParent{
vari:Int=1
//varm:String?//只有可为nil的类型会有默认值
varm:Int
init(m:Int){
self.m=m
}
}
classChild:Parent{
varn:Int
init(n:Int){
//阶段一
self.n=n//先把自己的活干完
super.init(m:1)//在叫父类干
//阶段二
m=2//不满意父类的,就自己干
}
}
好了,这是我对于swift中的class,struts的一些看法,写的不好,请见谅哦,谢谢
相关文章推荐
- swift学习笔记->类
- iOS --- 使用Shimmer来在Swift工程中添加微光闪烁的特效
- swift学习笔记->函数
- swift泛型的5个要点和代码
- Swift -1 语言基础
- swift学习笔记->基础类型
- Swift学习,常量与变量(二)
- swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)
- iOS.swift textfield中光标初始位置
- 《从零开始学Swift》学习笔记(Day 36)——静态方法
- 《从零开始学Swift》学习笔记(Day 36)——静态方法
- 奔五的人学iOS:swift获取连接的wifi名称及ap的mac地址
- swift之控制转移语句,continue,break,fallthrough,return,带标签的语句
- swift之switch续(元组,值绑定,where)
- swift语言之多线程操作和操作队列(上)———坚持51天吃掉大象
- Swift中数组(Arrary)及成员方法介绍
- Swift(二十四、访问权限)
- Swift(二十三、泛型)
- Swift(二十二、协议(2))
- Swift(二十一、协议(1))