我有一个小问题:

如何监听另一个类(“不可编辑的 !!”)中声明的struct-instance variable的更改?


我添加了一些小代码段以澄清我的想法。

说明:

  • FixedClass是不可编辑的类:我不想更改/我无法更改“FixedClass
  • 的任何代码
  • EditableClass可以编辑-我相信您可以通过查看代码(^ _ ^)/
  • 来获得它


    代码:
    let fixedClass: FixedClass = FixedClass()
    class FixedClass {
        struct MyObject {
            var abc = 0
        }
        var instance = MyObject()
        public init() { Timer.scheduledTimer(timeInterval: 0.4, target: self, selector: #selector(self.updateVar), userInfo: nil,  repeats: true) }
    
        @objc func updateVar() {
            instance.abc+=1
        }
        func getVar() -> Int {
            return instance.abc
        }
    }
    
    
    let editableClass: EditableClass = EditableClass()
    class EditableClass {
        public init() { }
        func listenForChange() {
            // listen for change event of FixedClass.getVar()
            print("Variable: \(fixedClass.getVar())")
        }
    }
    

    致电:editableClass.listenForChange()
    总结一下,我想听听FixedClass.getVar()结果的变化-最好避免使用loopstimers。但是,最重要的是至少使其工作。

    任何帮助将不胜感激,谢谢!

    最佳答案

    这将完全取决于“真实的” FixedClass的定义方式。即是NSObject的子类,还是ObjectiveC类,如何定义要观察的属性。

    就您的实际示例而言,您可以通过如下子类化来实现:

    var newFixedClass: NewFixedClass = NewFixedClass()
    var editableClass: EditableClass = EditableClass()
    
    protocol NewFixedClassProtocol: class {
        func changed(newFixedClass: NewFixedClass)
    }
    
    class NewFixedClass: FixedClass {
        public weak var delegate: NewFixedClassProtocol?
    
        override var instance: FixedClass.MyObject {
            didSet {
                self.delegate?.changed(newFixedClass: self)
            }
        }
    }
    
    class EditableClass: NewFixedClassProtocol {
        public init() {
            newFixedClass.delegate = self
        }
    
        func changed(newFixedClass: NewFixedClass) {
            print ("Value = \(newFixedClass.instance.abc)")
        }
    }
    

    因此,您基本上可以创建一个协议,该类进行观察,并创建一个FixedClass的子类,该子类具有协议类型的委托,并使用didSet观察者覆盖要观察的FixedClass的属性,然后该观察器将调用委托方法。在某些时候,您必须将观察类分配为子类的委托(我在init方法中作为测试来完成)。

    这样一来,我可以观察结构何时发生变化,但是我还没有接触过FixedClass。

    但是请注意,此方法在很大程度上取决于对原始FixedClass的了解,因此可能不适用于您的“现实世界”案例。

    (此外,我无法使其与类的全局定义实例一起使用,并且不得不将它们设置在我的初始视图控制器中,但这可能与我的测试方式有关,并且不会更改所涉及的方法)

    关于ios - swift :收听“结构变量”-更改事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48173005/

    10-13 09:31