计算属性本身不存储数据,而是从其他存储属性中计算得到数据。
计算属性概念:
计算属性提供了一个getter(取值访问器)来获取值,以及一个可选的setter(设置访问器)来间接设置其他属性或变量的值。计算属性的语法格式如下:
- 面向对象类型 类型名 {
- 存储属性
- ......
- var 计算属性名: 属性数据类型 {
- get {
- return 计算后属性值
- }
- set (新属性值) {
- ......
- }
- }
- }
定义计算属性比较麻烦,要注意后面的几个大括号的对齐关系。
我们先看一个示例:
- import Foundation
- class Employee {
- var no: Int = 0
- var firstName: String = "Tony" //存储属性
- var lastName: String = "Guan" //存储属性
- var job: String?
- var salary: Double = 0
- lazy var dept: Department = Department()
- var fullName: String { //计算属性
- get {
- return firstName + "." + lastName //返回拼接的结果
- }
- set (newFullName) { //存储传递进来的参数值
- var name = newFullName.componentsSeparatedByString(".")
- firstName = name[0]
- lastName = name[1]
- }
- }
- }
- struct Department {
- let no: Int = 0
- var name: String = ""
- }
- var emp = Employee()
- print(emp.fullName) //取出属性值
- emp.fullName = "Tom.Guan" //给属性赋值
- print(emp.fullName)
只读计算属性:
计算属性可以只有getter访问器,没有setter访问器,这就是只读计算属性。指定计算属性不仅不用写setter访问器,而且get{}代码也可以省略。与上一节相比,代码将大大减少。修改上一节示例为只读计算属性,代码如下:
- class Employee {
- var no: Int = 0
- var firstName: String = "Tony"
- var lastName: String = "Guan"
- var job: String?
- var salary: Double = 0
- lazy var dept: Department = Department()
- var fullName: String { //简洁的setter访问器
- return firstName + "." + lastName
- }
- }
- struct Department {
- let no: Int = 0
- var name: String = ""
- }
- var emp = Employee()
- print(emp.fullName)
只读计算属性不能够赋值,下列语句是错误的。
emp.fullName = "Tom.Guan"