gpt4 book ai didi

ios - 解决 Swift 属性覆盖中的递归

转载 作者:行者123 更新时间:2023-11-28 06:58:36 25 4
gpt4 key购买 nike

这是一个简单的 Swift 扩展,用于 UILabel,

let dur=0.1 // (set to say 2.0 to see the effect more clearly)
extension UILabel
{
func change(s:String)->()
{
print("attempting 'change' with \(s)")
UIView.animateWithDuration( dur,
animations: { self.alpha = 0.2 },
completion:
{ _ in
self.text = s ///CCC
UIView.animateWithDuration( dur,
animations: { self.alpha = 1.0 })
})
}
}

使用 UILabel,只需这样做

aLabel.change("hello there")

它将快速从旧文本融合到新文本。没问题。

当然,如果能这样写就更好了……

aLabel.text = "hello there"

为此,只需创建一个新的 UILabel 类,并使用新版本的“.text”属性。

class CoolLabel:UILabel
{
override var text:String?
{
get { return super.text }
set { super.change(newValue!) } //PROBLEM! AAA
}
}

但是!它不起作用:它进入无限循环。

注意 change() 扩展中的“self.text”:此时它进入循环。

(我也试过 set { self.change(newValue!) } 但它不起作用。)

以下完美运行:

class TOLabel:UILabel
{
override var text:String?
{
get { return super.text }
set
{
UIView.animateWithDuration( dur,
animations: { self.alpha = 0.2 },
completion:
{ _ in
super.text = newValue //BBB
UIView.animateWithDuration( dur,
animations: { self.alpha = 1.0 })
})
}
}
}

很好,但是我在第一个版本中做错了什么?

您将如何编写 setter 以成功使用 .change 扩展?


顺便说一句,对于阅读这里的任何人来说,您将如何更完全地继承 IBLabel,您必须覆盖指定的初始化器,并且,您需要保留文本的本地“实时”版本,以便 getter 正确回复在动画期间,在您设置文本后立即。

class TOLabel:UILabel
{
private var _text:String?
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
self._text = super.text;
}
override var text:String?
{
get { return self._text }
set {
self._text = newValue;
UIView.animateWithDuration( dur,
animations: { self.alpha = 0.2 },
completion:
{ _ in
super.text = self._text
UIView.animateWithDuration( dur,
animations: { self.alpha = 1.0 })
})
}
}
}

最佳答案

当您使用 self.text= 在您的 change 扩展方法中分配一个新值时,您的递归被调用,因为这将调用 setter,后者调用 改变等等。

在您的第二个示例中,您避免了递归,因为您可以从子类 setter 调用父类(super class) setter 。您的扩展程序中没有此选项,因为您的代码作为 UILabel 的扩展程序运行,因此没有可调用的父类(super class) setter

无论如何,在这种情况下创建一个子类而不是使用扩展是更正确的方法

关于ios - 解决 Swift 属性覆盖中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32662344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com