首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >didSet对willSet?

didSet对willSet?
EN

Stack Overflow用户
提问于 2017-07-11 02:03:35
回答 1查看 3K关注 0票数 3

我在编程方面非常新,我很难理解这两个属性观察者。

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

代码语言:javascript
复制
var isCheckInDatePickerShown: Bool = false {
    didSet{
        checkInDatePicker.isHidden = !isCheckInDatePickerShown
    }
}

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-11 02:11:10

As 苹果公司描述了

您可以选择在属性上定义这两个观察者中的任何一个或两个: 在存储值之前调用willSet。 在存储新值之后立即调用didSet。

因此,基本上,在willSet中执行的代码在运行时不会访问变量的newValue,而didSet将有权访问它(因为它是“设置好之后”)。

适用于:

代码语言:javascript
复制
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)")
    }
}

如果你叫他们:

代码语言:javascript
复制
print(isCheckInDatePickerShown)
.isCheckInDatePickerShown = true
print(isCheckInDatePickerShown)

将印刷:

错误 这个新的价值是:假的 真的

代码语言:javascript
复制
print(isCheckOutDatePickerShown)
.isCheckOutDatePickerShown = true
print(isCheckOutDatePickerShown)

将印刷:

错误 “设置后的新值为: true” 真的

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45024205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档