didSet vs willSet?

时间:2017-07-11 02:03:35

标签: ios swift

我非常擅长编程,而且我无法理解这两位属性观察者。

我目前正在构建一个带有表格视图的应用程序,其中日期选择器包含在其行中。在这种情况下,我有两个日期选择器。众所周知,日期选择器在单元格中占据很大的高度,因此您需要隐藏它们。以下代码负责:

var isCheckInDatePickerShown: Bool = false {
    didSet{
        checkInDatePicker.isHidden = !isCheckInDatePickerShown
    }
}

var isCheckOutDatePickerShown: Bool = false {
    didSet{
        checkOutDatePicker.isHidden = !isCheckOutDatePickerShown
    }
}

我对编程有非常基本的了解,所以我对didSet的功能感到困惑。 willSet会发生什么?

1 个答案:

答案 0 :(得分:0)

作为Apple describes it

  

您可以选择在a上定义其中一个或两个观察者   属性:

     

将在存储值之前调用willSet。

     

在存储新值后立即调用didSet。

因此,基本上在willSet中执行的代码在运行时将无法访问变量的newValue,而didSet将可以访问它(因为它已经设置了""' s' s 34)。

对于:

var isCheckInDatePickerShown: Bool = false {
    willSet{
        print("This new value is: \(isCheckInDatePickerShown)")
    }
}
var isCheckOutDatePickerShown: Bool = false {
    didSet{
        print("This new value after it was set is: \(isCheckOutDatePickerShown)")
    }
}

如果你打电话给他们:

print(isCheckInDatePickerShown)
.isCheckInDatePickerShown = true
print(isCheckInDatePickerShown)

将打印:

  

     

"这个新值是:false"

     

print(isCheckOutDatePickerShown)
.isCheckOutDatePickerShown = true
print(isCheckOutDatePickerShown)

将打印:

  

     

"设置之后的这个新值是:true"

     

正如您所看到的,在willSet中运行的代码还没有访问新值,因为它尚未提交到内存。而didSet确实可以访问它。