使用Swift属性观察器清理对象

在上一篇文章中,我们浏览了如何使用委托模式将视图与控制器分离。 今天,我们正在深入研究属性观察者的世界,以了解如何使用它们使对象更易于处理。

什么是财产观察员?

财产观察员观察并响应财产价值的变化。 每次设置属性值时都会调用属性观察器,即使新值与属性的当前值相同也是如此。

– Swift编程语言指南

以上解释几乎说明了一切。 在声明属性观察器时,我们这样做是因为我们有兴趣知道何时更改某个值。 引言告诉我们,“更改”并不一定意味着实际值已更改。 这个想法实际上是观察何时将变量写入其中,这可能是非常有用的事情。 除了观察并通知我们更改之外,我们还可以通过选择willSet (写之前)和/或didSet (写之后)观察者来选择希望在什么时间通知我们。

让我们看一些示例,这可以如何帮助我们清理代码并简化其他想要使用我们的实现的开发人员。 假设我们正在实现一个自定义进度条,该进度条将在您的应用程序的几个地方使用。 它由一个典型的蓝色条组成,该蓝色条随进度进行动画处理。 它还具有一个标签,用于向用户显示进度的四舍五入百分比值。

控制和强制变量的域

为了跟踪我们的进度,我们将使用Double类型的规范化值。 在这种情况下,归一化意味着我们将存储一个数字x,使得0≤x≤1。这种方法具有很多优点,尤其是在处理图形时。 它还负责检查设置的值,以使它们保留在域中。 让我们看看属性观察器如何帮助我们做到这一点:

 类ProgressBar { 
public var progress:Double = 0 {
didSet {
self.progress = min(max(self.progress,0),1)
print(“将新进度设置为\(self.progress)。”)
}
}
}

var p = ProgressBar()
p。进步= 2
//打印“将新进度设置为1.0”
进步= 0.2
//打印“将新进度设置为0.2”
p。进步= -100
//打印“将新进度设置为0.0”

很好 通过使用didSet观察器,我们可以确保进度值始终保持在其范围内。 我们还可以通过使用后备存储创建计算属性并使用setter来实现此行为,但这是另一篇文章的主题。

简化其他开发人员的使用

让我们考虑一下将自定义进度栏合并到应用程序中后的行为。 除了设置进度外,我们还需要设置动画条并设置标签以显示新的百分比值。 两者都是仅依靠我们的progress变量来完成工作的动作。 它们也是仅在更新进度时才需要执行的操作,因此没有必要向外部开发人员提供更新功能。 如果他们可以设置新的进度值并用它完成,会不会更容易? 当然可以!

 类ProgressBar { 
public var progress:Double = 0 {
didSet {
self.progress = min(max(self.progress,0),1)
animateBar()
updateLabel()
}
}

私人功能animateBar(){
//对新的进度值执行华丽的动画
}

私人功能updateLabel(){
//更新标签文字
}
}

现在我们在说话。 想想其他开发人员使用进度条时会看到什么。 将有一个变量供他们设置(即使对于初学者来说也很容易),并且当他们这样做时,它会照顾到所需的每个视觉更新。 想象一下,如何通过让开发人员在初始化时选择颜色,线宽和其他东西,使它更具可定制性。 您仍然只能向外暴露progress变量,因此使用它会很有趣!

关于观察者参数的几句话

声明属性观察器时,您还可以访问新的或旧的变量值。 willSet新值的默认名称只是newValue ,而didSet的旧值通过相同的逻辑命名为oldValue 。 声明观察者时,可以通过添加新名称来重命名这些参数,如下所示:

  public var someInt:Int = 0 { 
willSet(newInt){
//参数现在命名为newInt
}
didSet(originalInt){
//参数现在命名为originalInt
}
}

这次就是这样! 如果您有任何疑问,请随时发表评论,然后继续获取有关未来文章的通知。