我的目标:

//Object to observe
struct Text {
    let savedUserHeader: String
    let savedUserText: String
}

ClassA创建对象的位置:
//First Class
class A {
   func somefunc(){
      let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
    }
}

classB中,我想观察是否创建了新对象:
//Second Class
class B {
  var text: Text? {
      didSet{
        headerlabel.text = text.savedUserHeader
        saveUserLabel.text = text?.savedUserText
       }
   }
}

最佳答案

代表
您可以使用委托模式来观察,让我们创建一个名为ADelegate的协议:

protocol ADelegate {
    func didCreateText(text: Text)
}

然后,在类a中添加一个名为delegate的变量,并将一个Text对象传递到didCreateText(text:)方法中:
//First Class
class A {

    var delegate: ADelegate?

    func somefunc(){
        let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
        delegate?.didCreateText(text: a)
    }
}

接下来,在B中创建对象A时,设置somefunc()并实现a.delegate = self协议:
//Second Class
class B: ADelegate {

    var headerlabel: UILabel!
    var saveUserLabel: UILabel!

    var a = A()

    var text: Text? {
        didSet{
            headerlabel.text = text?.savedUserHeader
            saveUserLabel.text = text?.savedUserText
        }
    }

    init() {
        a.delegate = self
    }

    func didCreateText(text: Text) {
        print("savedUserHeader: \(text.savedUserHeader)")
        print("savedUserText: \(text.savedUserText)")
    }
}

就这样!当在ADelegate方法中创建对象didCreateText(text:)时,将调用Text方法:
let b = B()
b.a.somefunc()

通知中心
另一个解决方案是NotificationCenter。创建somefunc()对象时发布通知:
func somefunc(){
    let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
    NotificationCenter.default.post(name: Notification.Name("addText"), object: a)
}

在B级观察:
init() {
    NotificationCenter.default.addObserver(self, selector: #selector(observeText(noti:)), name: Notification.Name("addText"), object: nil)
}

@objc func observeText(noti: Notification) {
    if let text = noti.object as? Text {
        print("savedUserHeader: \(text.savedUserHeader)")
        print("savedUserText: \(text.savedUserText)")
    }
}

让我们来测试一下:
let b = B()
let a = A()
a.somefunc()

你会看到结果:
savedUserHeader: testHeader
savedUserText: testText

关于swift - 如果在Class中创建了对象,如何在Class B中进行观察?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43026196/

10-14 22:35
查看更多