swift willSet didSet并获取属性中的set方法
在使用这个属性的时候, willSet
– didSet
和get
– set
什么区别?
从我的angular度来看,他们都可以为物业设定一个价值。 何时以及为什么我应该使用willSet
– didSet
,以及何时set
?
我知道,对于willSet
和didSet
,结构如下所示:
var variable1 : Int = 0 { didSet { println (variable1) } willSet(newValue) { .. } } var variable2: Int { get { return variable2 } set (newValue){ } }
何时以及为什么要使用willSet / didSet
- 将在存储值之前调用
willSet
。 - 在新值被存储之后立即调用
didSet
。
考虑你的例子与输出:
var variable1 : Int = 0 { didSet{ println("didSet called") } willSet(newValue){ println("willSet called") } } println("we are going to add 3") variable1 = 3 println("we added 3")
输出:
we are going to add 3 willSet called didSet called we added 3
它像前/后条件一样工作
另一方面,如果你想添加一个只读属性,你可以使用get
:
var value : Int { get { return 34 } } println(value) value = 2 // error: cannot assign to a get-only property 'value'
马克西姆的答案是你问题的第一部分。
至于什么时候使用get
和set
:当你想要一个计算的属性。 这个:
var x: Int
创build一个存储的属性 ,该属性由一个variables自动备份(但不能直接访问)。 设置该属性的值在设置属性中的值时被翻译,类似地被获取。
代替:
var y = { get { return x + 5 } set { x = newValue - 5} }
将创build一个计算属性,而不是一个variables的备份 – 而不是你必须提供getter和/或setter的实现,通常读取和写入值从另一个属性,更一般地作为计算的结果(因此计算属性名称)
build议阅读: 属性
注意 :你的代码:
var variable2: Int { get{ return variable2 } set (newValue){ } }
是错误的,因为在你试图返回自己,这意味着调用recursion。 事实上,编译器会用一条消息来警告你,比如Attempting to access 'variable2' within its own getter
。
var variable1 : Int = 0 { //It's a store property didSet { print (variable1) } willSet(newValue) { .. } } var variable2: Int { //It's a Computed Proprties get { return variable2 } set (newValue){ } }
有关Store属性和计算属性的详细信息
所以当你试图在赋值时把值赋给variables的时候出现了'didSet'和'willSet'的概念。 正如@Maxim所说
- 将在存储值之前调用willSet 。
- 在新值被存储之后立即调用didSet 。
'willSet'和'didSet'的例子:
class Number { var variable1 : Int = 0 { didSet{ print("didSet called") } willSet(newValue){ print("willSet called") } } } print("we are going to add 3") Number().variable1 = 3 print("we added 3")
// O / P:
我们要加3
willSet调用
didSet打电话
我们加了3
而且一般当两个属性依赖于当时使用'get'&'set'的时候。 (它也用于协议这是不同的概念。)
'get'&'set'的例子:
class EquilateralTriangle{ var sideLength: Double = 0.0 init(sideLength: Double){ self.sideLength = sideLength } var perimeter: Double { get { return 3.0 * sideLength } set { sideLength = newValue / 3.0 } } } var triangle = EquilateralTriangle(sideLength: 3.0) print(triangle.perimeter) //o/p: 9.0 triangle.perimeter = 12.0 print(triangle.sideLength) //o/p: 4.0