我遇到了一个小问题:
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()
的变化。结果 - 最好避免使用 loops
或 timers
.然而,最重要的是至少让它发挥作用。
非常感谢任何帮助,谢谢!
最佳答案
这将完全取决于“真正的”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/