swift willSet didSet并获取属性中的set方法

在使用这个属性的时候, willSetdidSetgetset什么区别?

从我的angular度来看,他们都可以为物业设定一个价值。 何时以及为什么我应该使用willSetdidSet ,以及何时set

我知道,对于willSetdidSet ,结构如下所示:

 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' 

马克西姆的答案是你问题的第一部分。

至于什么时候使用getset :当你想要一个计算的属性。 这个:

 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