第2部分 故事的进阶要素 - 编程语言Swift的进阶部分
9.属性
9.1 概念通俗讲解
属性这个概念是针对类和结构体而言的,举例说明比较好理解。例如定义一个类:人,我们可以定义这个人的很多属性,例如年龄,身高,体重。抛开类的概念,属性其实就是变量和常量。
1). 在存储的方式上,属性可以分为存储属性和计算属性
(1)存储属性的含义是常量或变量的值存储为实例的一部分。存储属性简单理解的话,存储属性和我们之前讲的普通的常量与变量差不多。
(2)计算属性是通过计算得到一个值,简单理解的话,可以把计算属性理解为一个有返回值的函数。
2). 在使用的范围上,属性可以分为类属性和实例属性
(1)实例属性是特定类型的实例属性。每次创建该类型的新实例时,它都有自己的一组属性值,与任何其他实例不同。
例如我们创建类"人"的实例属性"年龄"。然后创建实例"小王",“小张”,“小王”,“小张"的年龄属性是各自不同的。
(2)类属性是对某个类型的所有实例都可用的值,例如定义一个属性"死亡”。这个属性无论是小王还是小张都会有,此时可以把"死亡"属性定义为类属性。
9.2 定义简洁介绍
定义实现如下
class Person{
//存储属性的变量,注意:存储属性必须有初始值
var age = 10
//计算属性
var height: Int{
get{
return 180
}
set(value){
age = value*2
}
}
//实例属性
var weight = "80KG"
//类属性
static var isDeath = true
}
上面的定义涵盖了存储属性age,计算属性height,实例属性weight,类属性isDeath
9.3 我的经验总结
1). 存储属性与计算属性
(1)存储属性比较简单,基本把它理解为变量和常量来用就行。
(2)计算属性,把它理解为一个有返回值的函数就行。
对于计算属性,必须有get。set可以没有。例如
var height: Int{
get{
return 180
}
}
如果没有set,代表为只读,也就是说不能改它的值。
例如
class Person{
var height: Int{
get{
return 180
}
}
}
var xiaoWang = Person()
如果没有set方法,此时想改height的值是不允许的,例如如下的代码是不允许的
xiaoWang.height = 190
2). 类属性与实例属性
(1)实例属性
var xiaoLi = Person()
xiaoLi.weight = "90KG"
(2)类属性
类属性直接调用类来操作
Person.isDeath = false
对于类属性,除了可以用static关键字,还可以用class关键字
它俩的区别如下
存储属性只能使用static关键字且不能子类重写
计算属性可以用static和class关键字,使用static关键字时子类不能重写,使用class关键字时子类能重写
注:关于类的继承,重写等概念,后面会详细介绍
举例
class Dad{
//存储属性不能用class关键字,需要用static关键字
//爸爸是男性
static var sex = "男"
//类计算属性如果想要被子类重写,需要使用class关键字。如果没这个需求,写static和class均可
class var height:Int{
set{
}
get{
//爸爸身高1米8
return 180
}
}
}
//输出爸爸的性别
print("Dad.sex = \(Dad.sex)")
//输出爸爸的身高
print("Dad.height = \(Dad.height)")
//儿子继承爸爸
class Son : Dad{
//重写身高,儿子的身高为1米1
override class var height:Int{
set{
}
get{
return 110
}
}
}
//输出儿子的性别
print("Son.sex = \(Son.sex)")
//输出儿子的身高
print("Son.b = \(Son.height)")
这里儿子继承了爸爸的属性和方法,然后重写了身高属性,所以这两个输出值是不同的。对于性别属性,因为没有重写所以输出值是一样的。
3). 存储属性,计算属性和实例属性,类属性的关系
存储属性,计算属性两者是互斥的,同理实例属性,类属性也是互斥的。但是存储属性,计算属性和实例属性,类属性并不互斥。一个存储属性可以也是实例属性或类属性,同样一个计算属性可以也是实例属性或类属性。
注:本人水平和能力有限,如果哪些地方写错了,请大家给我反馈,我会及时修改。