/**
(5)计算属性
1.Swift中的计算属性不直接存储值,跟存储属性不同,没有任何的“后端存储与之对应”。
2.计算属性用于计算,可以实现setter和getter这两种计算方法。
let value = 对象.属性 getter方法 (读)
一定要记住,Swift语言中的计算属性不可以存储值。OC中的可以存储值,当然也可以有后端存储。
这一点和OC不一样啊
*/
struct MyRect {
var origion:(x: Double,y: Double) = (0,0)
var size: (w: Double,h: Double) = (0,0)
var center: (x: Double,0)
}
var rect = MyRect()
rect.size = (100,100)
rect.origion = (0,0)
rect.center = (rect.origion.x + rect.size.w / 2,rect.origion.y + rect.size.h / 2)
/**
center 我们可以通过 size 和 origion来计算出来,也就是说我们没有必要将center
*/
struct MyRect2 {
var origion:(x: Double,0)
// 计算属性,没有存储功能的,必须声明为var属性,let不可以
var center: (x: Double,y: Double) {
get {
print("test get")
return (origion.x + size.w / 2,origion.y + size.h / 2)
}
// n 是 (x: Double,y: Double)
// 不写 n的时候,系统默认提供 newValue
set(n) {
print("test set")
// 不可以这样写的,因为center没有存储功能,是计算属性,不可以被赋值
// center = n
// center.x = n.x
// center.y = n.y
// 那么我们可以改变起点坐标,因为origion是存储属性,可以被赋值
origion.x = n.x - size.w / 2
origion.y = n.y - size.h / 2
}
}
}
var rect2 = MyRect2()
rect2.size = (100,100) // setter
rect2.origion = (0,0)
// 可以读取这个属性
print("--------------------->")
print(rect2.center) // getter
print("--------------------->")
print(rect2.center.x)
print("--------------------->")
print(rect2.center.y)
/**
这个属性仍然可以 设定
看起来可以对其赋值,但是其实没有真正的把这个(100,100) 存储一个叫center的属性里面
*/
rect2.center = (100,100) // setter
print("--------------------->")
print(rect2.origion.x)
print("--------------------->")
print(rect2.origion.y)