ios - swift:监听 "struct variable"-change 事件?

标签 ios swift struct instance

我遇到了一个小问题:

How is it possible to listen for the change of a struct-instance variable declared in another ("uneditable!!") class?


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

说明:

  • 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 是如何定义的。 IE。是不是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)")
    }
}

所以你基本上创建了一个执行观察的类支持的协议(protocol),创建一个 FixedClass 的子类,它有一个协议(protocol)类型的委托(delegate),并覆盖你想用 didSet 观察者观察的 FixedClass 的属性,然后调用委托(delegate)方法。在某些时候,您必须将观察类分配为子类的委托(delegate)(我在 init 方法中作为测试这样做)。

这样做我可以观察到结构何时发生变化,但我没有触及 FixedClass。

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

(顺便说一句,我无法让它与全局定义的类实例一起使用,不得不将它们设置在我的初始 View Controller 中,但这可能与我的测试方式有关,并且不会改变涉及的方法)

关于ios - swift:监听 "struct variable"-change 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173005/

相关文章:

struct - D 中的常量结构

ios - 调用layer.setNeedsDisplay()显示黑色背景

javascript - iPhone webview 键盘将布局上推并保留

swift - 将 SKNodes 添加到 SKScene 减慢动画

ios - 这个 block 在 Swift - Alamofire 中意味着什么?

c - 安全结构嵌入式系统

json - 如何将嵌套的 JSON 数组解析为 Codable 结构

ios - 如何将NSNumber转换为float?

objective-c - '{' token 之前的预期表达式

ios - 如何增加 UICollectionViewCell 高度并在 Swift 中单击按钮后显示标签