我想知道是否可以在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/