Swift:在协议扩展中初始化对象后调用某个方法
假设我有一个结构:Swift:在协议扩展中初始化对象后调用某个方法,swift,oop,swift2,swift-protocols,Swift,Oop,Swift2,Swift Protocols,假设我有一个结构: class A: UIViewController { } class C { } class B: A, P { typealias T = C } protocol P: class { typealias T } extension P { func initP() { print("test") } } 是否可以在不修改B的情况下调用initP?其他任何内容都可以修改。 我试图创建一些类似于泛型抽象类的东西。
class A: UIViewController {
}
class C {
}
class B: A, P {
typealias T = C
}
protocol P: class {
typealias T
}
extension P {
func initP() {
print("test")
}
}
是否可以在不修改B的情况下调用initP?其他任何内容都可以修改。
我试图创建一些类似于泛型抽象类的东西。系统(A,P)是基础。(B,C)——具体执行。方法initP对于所有实现都完全相同。这就是为什么我尽量避免在植入术中使用它。另一方面,它使用P中的方法和类型。这就是为什么我不能简单地在A中调用它。
首先,我尝试创建一个通用的,但在这种情况下,如果在情节提要中将B作为场景类传递,那么应用程序在运行时会崩溃
extension P {
init() { // Or initWithCoder since it's a ViewController?
print("test")
self.init()
}
}
为什么这对你不起作用:
extension P {
init() { // Or initWithCoder since it's a ViewController?
print("test")
self.init()
}
}
因为您使用了协议扩展来定义
initP
,所以只要知道某个对象实现了协议,该函数就可以使用
B().initP()
let b:B
b.initP()
class C : P {
init() {
initP()
}
}
class B: A, P {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
initP()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initP()
}
}
都是有效的。因为您使用了协议扩展来定义
initP
,所以该函数将在已知对象实现协议时可用
B().initP()
let b:B
b.initP()
class C : P {
init() {
initP()
}
}
class B: A, P {
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
initP()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initP()
}
}
都是有效的。如前所述,您的第一个代码块将无法编译,因为
initialize
是一个类函数,initP
是一个实例函数,因此initialize
无法调用initP
。这是艰难的一天,我错过了这是静态的。但是,有没有可能在给定限制的情况下从第二个块调用initP?我已经修改了这个问题以显示我真正的问题。我不确定在实例化类B时,您想在哪里调用initP
。实际上,如果在viewDidLoad或任何其他UiViewController生命周期方法上调用它是可以接受的。如上所述,您的第一个代码块不会编译,因为initialize
是一个类函数,initip
是一个实例函数,因此initialize
不能调用initP
。这是艰难的一天,我错过了这是静态的。但是,有没有可能在给定限制的情况下从第二个块调用initP?我已经修改了这个问题以显示我真正的问题。我不确定在实例化类B时,您想在哪里调用initP
。实际上,如果在viewDidLoad或任何其他UiViewController生命周期方法上调用它,这是可以接受的。我明天才能尝试。但问题是P不知道,它将被应用到UIViewControllerI的子类,我只能在明天尝试。但问题是P不知道,它会被应用到UIViewControllerI的子类中。我试图创建一些类似于泛型抽象类的东西。制度是基础具体实施。方法callP对于所有实现都是完全相同的。这就是为什么我尽量避免在植入术中使用它。另一方面,它使用P中的方法和类型。这就是为什么我不能简单地在A中调用它。因此,callP对于所有实现和调用initP都是相同的,但是initP是特定于每个实现的?它是通用的,但完全相同。类似于initP={print(T)}抱歉,现在已经很晚了,我犯了错误。CallP和initP是同一个东西,我正在尝试创建类似于泛型抽象类的东西。制度是基础具体实施。方法callP对于所有实现都是完全相同的。这就是为什么我尽量避免在植入术中使用它。另一方面,它使用P中的方法和类型。这就是为什么我不能简单地在A中调用它。因此,callP对于所有实现和调用initP都是相同的,但是initP是特定于每个实现的?它是通用的,但完全相同。类似于initP={print(T)}抱歉,现在已经很晚了,我犯了错误。CallP和initP是一回事