9.5 Swift计算属性, 实现setter和getter
/** (5)计算属性 1.Swift中的计算属性不直接存储值,跟存储属性不同,没有任何的“后端存储与之对应”。 2.计算属性用于计算,可以实现setter和getter这两种计算方法。 3.枚举不可以有存储属性,但是允许有计算属性。
对象.属性 = 某个值 setter方法 (写) 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的属性里面 实际上是在set方法中修改的是origion的存储属性。 */ rect2.center = (100,100) // setter print("--------------------->") print(rect2.origion.x) print("--------------------->") print(rect2.origion.y) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |