标签:
首先呢,我们先声明一个类
class Parent { //声明一个属性 var p1: String = "abc" //声明一个方法 func m() { print("parent m") } //声明一个静态的方法 final func n(){ } }
然后我们new一个Parent类(注意了,在swift中是没有new的,如果想new 一个的话, 直接调用该类就可以了)
var par = Parent()
调用parent的方法和属性
par.m() //在控制台显示的是Parent m par.p1 //在控制台显示的是5
好了, 这就是我们常用的class的定义以及方法(属性)的调用
接下来呢, 我们要学习swift中关于父类的继承
我们就拿上面的那个Parent当作父类,我们先写一个子类来继承该父类,如果想
重写父类的属性或者方法时,一定要加一个override关键字
class Child: Parent { //重写父类的属性或者方法时,一定要加一个override关键字 //因为这里定义的父类属性是存储属性,所以如果要重写父类的话, 就要把p1变成一个计算 //属性 override var p1: String{ get { return "dasdf" } set { } } override func m() { print("child m") }
调用子类的属性
var par1: Parent = Child1() print("dfdfd\(par1.p1)") //显示的是dfdfddasdf
如果要继承一个父类的话,得先注意以下几点要求
1.重写父类的存储属性后可以给它加观察者(新功能)
2.可以把其改为计算属性 (但是不能减少其功能)
3.父类的只读(只有get,或者let),子类不能添加观察者
****************************
类和结构体是人们构建代码所用的一种通用且灵活的构造体。为了在类和结构体中实现各种功能,我们必须要严格按照对于常量,变量以及函数所规定的语法规则来定义属性和添加方法。
与其他编程语言所不同的是,Swift 并不要求你为自定义类和结构去创建独立的接口和实现文件。你所要做的是在一个单一文件中定义一个类或者结构体,系统将会自动生成面向其它代码的外部接口。
注意:通常一个类的实例被称为对象。然而在Swift 中,类和结构体的关系要比在其他语言中更加的密切,本章中所讨论的大部分功能都可以用在类和结构体上。因此,我们会主要使用实例而不是对象。
接下来呢, 我们就讲一下关于swift中的class和struts有什么共同点和不同点
Swift 中类和结构体有很多共同点。共同处在于:
定义属性用于储存值
定义方法用于提供功能
定义下标用于通过下标语法访问值
定义初始化器用于生成初始化值
通过扩展以增加默认实现的功能
符合协议以对某类提供标准功能
与结构体相比,类还有如下的附加功能:
继承允许一个类继承另一个类的特征
类型转换允许在运行时检查和解释一个类实例的类型
取消初始化器允许一个类实例释放任何其所被分配的资源
引用计数允许对一个类的多次引用
*******************************
初始化:类型(枚举,结构,类)的实例在构建过程中得一系列过程
初始化的主要目的:对内部的存储属性赋值
结构:如果不自己添加初始化,会自动添加默认init和memberwise init
//这里定义了一个struct , struct Point3 { var x: Int = 1 var y: 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.专门(特定)的初始化器designated initiliazer赋值,作用是给本类的所有存储属性赋值
2.在变量(常量)后面直接赋值
class的专门初始化器:
1.可以有多个
2.互相不能调用,每一个负责实现所有本类存储属性的初始化
3.负责处理继承过来的存储属性的初始化。
3.1 相信别人,所以表现就是调用父类的特定初始化器(不能
调用父类的便利初始化器)
便利的初始化器:
1.可以有多个
2.可以调用本来其它的便利初始化器,也可以调用本类的特定初始化器
3.最终一定是调用本类的特定初始化器
//作用:1.给本类的所有存储属性赋值 class AA { var m:Int var n:Int
//特定的初始化器 init(mm: Int,nn: Int) { m = mm n = nn } init() { m = 111 n = 22 //这里会报错,表明特定的init之间不能相互调用 //所以建议:实际每个类只写一个特定的初始化器 // self.init(mm:111,nn:222) } //便利的初始化器需要调用专门的初始化器(直接或间接都可以) convenience init(mm: Int){ self.init(mm:mm,nn:1) } convenience init(nn: Int){ //self.init(mm:1,nn:2) self.init(mm:nn) } }
再然后呢,我们再看一段代码, 如何通过子类来实现父类的初始化工作
class Parent { var i:Int = 1 // var m: String? //只有可为nil的类型会有默认值 var m: Int init(m: Int) { self.m = m } } class Child :Parent { var n: Int init(n: Int) { //阶段一 self.n = n //先把自己的活干完 super.init(m: 1)//在叫父类干 //阶段二 m = 2//不满意父类的,就自己干 } }
好了,这是我对于swift中的class,struts的一些看法,写的不好, 请见谅哦, 谢谢
标签:
原文地址:http://www.cnblogs.com/zhengyc/p/4970003.html