我想知道是否可以在init()之后或deinit()之前获得回调。

我的代码中有这种重复模式。首先运行init()。下一个fire()函数将运行。

class ParentViewController: UIViewController {
    @IBAction func redButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.redColor(), name: "RED").fire()
    }
    @IBAction func greenButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.greenColor(), name: "GREEN").fire()
    }
    @IBAction func blueButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.blueColor(), name: "BLUE").fire()
    }
    @IBAction func resetButtonAction(sender: AnyObject) {
        ResetEvent().fire()
    }
}


所需的代码,而无需调用fire()函数。我希望它在创建后自动触发。我的代码始终在主线程上运行,所以我想我可以为此使用一个计时器。但是我正在寻找没有计时器的解决方案。

class ParentViewController: UIViewController {
    @IBAction func redButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.redColor(), name: "RED")
    }
    @IBAction func greenButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.greenColor(), name: "GREEN")
    }
    @IBAction func blueButtonAction(sender: AnyObject) {
        PickedColorEvent(color: UIColor.blueColor(), name: "BLUE")
    }
    @IBAction func resetButtonAction(sender: AnyObject) {
        ResetEvent()
    }
}


是否可以摆脱fire()函数?

更新1(感谢@ luk2302的反馈)

事件类从协议继承。我可以将协议更改为类或结构,然后在基类中调用fire()。但是,然后我决定子类是否可以是struct或class。

当只调用ResetEvent()而不使用结果时,我得到了Result of initializer is unused。我希望有一个保留的关键字来禁止显示该警告。

最佳答案

您可以在初始化所有存储的属性后使用fire函数,因为您可以调用类和/或struct中定义的任何其他函数

protocol P {}
extension P {
    func fire(s: String) {
        print("fire from \(s)")
    }
}
class C:P {
    var i: Int
    init(i:Int) {
        self.i = i
        foo()
        fire("class init i: \(self.i)")
    }
    deinit {
        fire("class deinit i: \(i)")
    }
    func foo() {
        i += 1
    }
}

struct S:P {
    var i: Int
    init(i: Int){
        self.i = i
        foo()
        fire("struct init i: \(self.i)")
    }
    mutating func foo() {
        i += 10
    }

}

C(i: 5)
S(i: 1)

/*
fire from class init i: 6
fire from struct init i: 11
fire from class deinit i: 6
*/


如果要避免编译器警告“初始化器的结果未使用”,请使用下一种语法

_ = C(i: 5)
_ = S(i: 1)

关于swift - 创建后回调:如何在ctor之后立即运行代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35537584/

10-09 02:41