9.5 Swift计算属性, 实现setter和getter

/**

5)计算属性

1.Swift中的计算属性不直接存储值,跟存储属性不同,没有任何的后端存储与之对应

2.计算属性用于计算,可以实现settergetter这两种计算方法

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)

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...