Swift   发布时间:2022-04-29  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了swift – Inner didSet保护奇怪地扩展到全班?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
众所周知,didSet不会再从didSet内部运行在同一个对象上. ( example.)

然而.似乎:限制不仅适用于该对象,也适用于同一类的任何对象.

以下是Playground的复制粘贴测试用例.

class C {
    var Test: Bool = false {
        didSet {
            print("test.")
            for c in r {
                c.Test = true
            }
        }
    }
    var r:[C] = []
}
var a:C = C()
var b:C = C()
var c:C = C()
a.r = [b,c]
a.Test = false

不行!

class C {
    var Test2: Bool = false {
        didSet {
            print("test2.")
            global.Test2 = true
        }
    }
}
var global:C = C()
var a:C = C()
a.Test2 = false

不行!

>这是一个Swift错误吗?
>如果没有,实际限制是什么?它不会运行从didSet开始的任何didSet(无论如何)?同一个班级?同一个超级班?要么?
>这在doco中究竟解释了什么?

WTF.人们需要知道……具体的实际限制是什么?

解决方法

这是错误 SR-419.

从对bug的评论

从我的实验看来,只有在任何对象上设置相同的属性时才会调用didSet观察者.如果设置任何其他属性(即使在同一对象上),则会正确调用观察者.

class A {
    var name: String
    var related: A?
    var property1: Int = 0 {
        didSet {
            print("\(Name),setTing property 1: \(property1)")

            self.property2 = 100 * property1
            related?.property1 = 10 * property1
            related?.property2 = 100 * property1
        }
    }
    var property2: Int = 0 {
        didSet {
            print("\(Name),setTing property 2: \(property2)")
        }
    }

    init(name: String) {
        self.name = name
    }
}

let a = A(name: "Base")
a.related = A(name: "Related")
a.property1 = 2

输出

当预期的输出应该是:

您似乎还需要直接从观察者分配该属性.一旦你输入另一个函数(或观察者),观察者就会再次开始工作:

var property1: Int = 0 {
    didSet {
        print("\(Name),setTing property 1: \(property1)")

        onSet()
    }
}

...    
func onSet() {
    self.property2 = 100 * property1
    related?.property1 = 10 * property1
    related?.property2 = 100 * property1
}

这是最好的解决方法.

另一种解决方法(感谢@Hamish)是将嵌套的赋值包装到一个立即执行的闭包中:

var property1: Int = 0 {
    didSet {
       {
           self.property2 = 100 * property1
           related?.property1 = 10 * property1
           related?.property2 = 100 * property1
       }()
    }
}

根据闭包前的代码,您可能必须将其包装到括号中或在前面的语句后插入分号.

大佬总结

以上是大佬教程为你收集整理的swift – Inner didSet保护奇怪地扩展到全班?全部内容,希望文章能够帮你解决swift – Inner didSet保护奇怪地扩展到全班?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。