第十章 属性
2. Computed Properties (计算属性)
除了存储属性以外,结构体
,类
和枚举
可以定义计算属性,而计算属性不会像存储属性那样结构体和类那样存储常量和/或变量的值,计算属性则是提供getter
和可选的setter(setter?
)来间接地检索或/和设置其他属性或值。
// 初始化X和Y轴的点
struct Point {
var x = 0.0, y = 0.0
}
// 初始化宽和高的数值
struct Size {
var width = 0.0, height = 0.0
}
// 形成的长方形结构体
struct Rect {
// 引用结构体Point和Size
var origin = Point()
var size = Size()
// 长方形结构体的变量属性
var center: Point {
// 获取center后Point的X和Y轴的点
get{
// 重新赋值
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
// 返回X和Y轴的点给变量center
// 变量center引用的是Point结构体
return Point(x: centerX, y: centerY)
}
// 设置新的Point结构体
set(newCenter){
// 改变原有的X点
origin.x = newCenter.x - (size.width / 2)
// 改变原有的Y点
origin.y = newCenter.y - (size.height / 2)
}
}
}
// 创建新的正方形变量,该变量引用了长方形中的点和长宽尺寸
var square = Rect(origin: Point(x: 0.0, y: 0.0), size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
// 重新分配初始化后的图像
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at(\(square.origin.x), \(square.origin.y))")
2.1 Shorthand Setter Declaration (简写setter的定义)
有些时候计算属性里面的setter没用定义新的参数名,newValue
这个默认的参数名就会被应用在setter里面。下面是省略setter参数名的结构体Rect的表达。
struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
// 在这里省略掉set的参数名newValue
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
2.2 Shorthand Getter Declaration (简写getter的定义)
如果这个getter的主体只是一个单一的表达,这个时候getter可以隐含地返回这个表达式,就此省略return关键字,详细参考函数章节中的隐含返回函数(Functions with an implicit return) 其实就是该getter或函数是由返回值的 而是没有注明,基于Swift语言特性该返回是默认进行的。下面这个例子就是简写getter之后的Rect结构体。
struct CompactRect {
var origin = Point()
var size = Size()
var center: Point {
// 获取 + - * / 运算后结构体Point的X和Y轴上的点
get {
// 现在Point中的X的值进行可 + (size.width / 2)的运算了
Point(x: origin.x + (size.width / 2),
y: origin.y + (size.height / 2))
// 隐匿返回了return的值
// 也就是省略了
// return Point(x: origin.x, y: origin.y)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
}
}
2.3 Read-Only Computed Properties (只读计算属性)
一个只有getter没有setter的计算属性,我们称之为只读计算属性。只读属性都会有一个返回值。我么可以用dot语法来读取该属性值,但是不能给只读属性设置另一个值。可以在只读计算属性里面省略掉get
关键字和它的大括号({ }
)。
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
// 只读计算属性里
// 可以省略get关键字和它的大括号
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")