您的位置:首页 > 移动开发 > Swift

浅谈swift中的那些类,结构以及初始化的操作

2015-11-16 20:59 225 查看
首先呢,我们先声明一个类

classParent{
//声明一个属性
varp1:String="abc"

//声明一个方法
funcm(){
print("parentm")
}

//声明一个静态的方法
finalfuncn(){

}
}


然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new一个的话,直接调用该类就可以了)

varpar=Parent()


调用parent的方法和属性

par.m() //在控制台显示的是Parentm par.p1 //在控制台显示的是5

好了,这就是我们常用的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中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。

接下来呢,我们就讲一下关于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的一些看法,写的不好,请见谅哦,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航