swift将设置didSet并获取属性中的set方法

时间:2014-08-20 07:10:25

标签: ios swift properties didset

willSet - didSetget - set之间在使用此属性时有什么区别?

从我的角度来看,他们都可以为一个属性设置一个值。何时以及为何应该使用willSet - didSet,何时使用get - set

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

var variable1 : Int = 0 {
    didSet {
        println (variable1)
    }
    willSet(newValue) {
    ..
    }
}

var variable2: Int {
    get {
        return variable2
    }
    set (newValue){
    }
}

5 个答案:

答案 0 :(得分:44)

  

何时以及为什么我应该使用willSet / didSet

  • willSet在> 之前被称为
  • didSet存储新值后立即调用

考虑一下输出的例子:


var variable1 : Int = 0 {
        didSet{
            print("didSet called")
        }
        willSet(newValue){
            print("willSet called")
        }
    }

    print("we are going to add 3")

     variable1 = 3

    print("we added 3")

输出:

we are going to add 3
willSet called
didSet called
we added 3

它的作用类似于前/后条件

另一方面,如果要添加(例如)只读属性,则可以使用get

var value : Int {
 get {
    return 34
 }
}

print(value)

value = 2 // error: cannot assign to a get-only property 'value'

答案 1 :(得分:23)

@Maxim的回答是问题的第1部分。

何时使用getset:何时需要计算属性。这样:

var x: Int

创建一个存储属性,它由变量自动备份(尽管不能直接访问)。设置该属性的值将在设置属性中的值时进行转换,类似于获取。

相反:

var y = {
    get { return x + 5 }
    set { x = newValue - 5}
}

将创建一个计算属性,它不会被变量备份 - 而是你必须提供getter和/或setter的实现,通常是从另一个属性读取和写入值,更常见的是作为计算的结果(因此计算属性名称)

建议阅读:Properties

注意:您的代码:

var variable2: Int {
    get{
        return variable2
    }
    set (newValue){
    }
}

错误,因为在get中你试图返回自己,这意味着递归地调用get。实际上,编译器会使用Attempting to access 'variable2' within its own getter等消息警告您。

答案 2 :(得分:2)

设置

  

get set 计算属性哪个实际上并不存储   值即可。相反,它们提供了一个getter和一个可选的setter   间接检索和设置其他属性和值

此外,您还可以定义只读计算属性。 只读计算属性总是返回一个值,可以通过点语法访问,但不能设置为不同的值

示例仅获取属性 -

 var number: Double {
        return .pi*2
    }

willSet didSet

  

willSet didSet Property Observers

     

财产观察员观察并回应房产的变化   值。每次物业的价值都会调用物业观察员   设置,即使新值与属性的当前值相同   值。

  • 将在存储值之前调用willSet。
  • 存储新值后立即调用
  • didSet。

示例 -

var score: Int = 0 {
    willSet(newScore) {
        print("willSet  score to \(newScore)")
    }
    didSet {
        print("didSet score to \(oldValue) new score is: \(score)")
    }
}
score = 10
//Output 
//willSet  score to 10
//didSet score to 0 new score is: 10

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

答案 3 :(得分:1)

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 property and computed property的详细信息 因此,当您尝试在该分配时间将值分配给变量时,' didSet' &安培; ' willSet&#39 ;.正如@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个

通常当两个财产在那个时候依赖时,得到' &安培; '设定'用过的。 (它也在protocol中使用,这是不同的概念。)  

' get' &安培; '设定':

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

答案 4 :(得分:0)

获取设置

如果要实现gettable和settable属性,可以使用常规get-and-set语法。但是,如果您实现get属性,则可以仅使用read-only语法。使用setter,您将获得newValue属性。

class GetterSetter {
    var theValue: Bool = false
    var property: Bool {
        get { return theValue }
        set {
            print("Value changed from \(theValue) to \(newValue)")
            theValue = newValue
        }
    }
}

let getterSetter = GetterSetter()
getterSetter.property = true
getterSetter.property

// PRINTS:
// Value changed from 'false' to 'true'

didSet

didSet 属性观察器用于在刚设置属性时需要执行代码的情况。实现didSet后,您将获得oldValue来代表先前的值。

class DidSetter {
    var property: Float16 = -1.0 {
        didSet {
            print("Value changed from \(oldValue) to \(property)")
        }
    }
}

let didSetter = DidSetter()
didSetter.property = 5.0
didSetter.property

// PRINTS:
// Value changed from -1.0 to 5.0

willSet

willSet 属性观察器用于在设置属性之前需要执行代码的情况。实施willSet后,您将获得newValue来表示它将要成为的新属性值。

class WillSetter {
    var property: String = "NO" {
        willSet {
            print("Value changed from \(property) to \(newValue)")
        }
    }
}

let willSetter = WillSetter()
willSetter.property = "YES"
willSetter.property

// PRINTS:
// Value changed from NO to YES