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是一回事