Swift:在协议扩展中初始化对象后调用一些方法

时间:2016-03-17 21:18:40

标签: 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?其他任何东西都可以修改。 我正在尝试创建类似通用抽象类的东西。系统(A,P)是Base。 (B,C) - 具体实施。方法initP对于所有实现都完全相同。这就是我试图避免在植入中调用它的原因。另一方面,它使用来自P的方法和类型。这就是为什么我不能简单地在A中调用它。 首先,我尝试制作A泛型,但在这种情况下,如果B作为故事板中场景的类传递,App会在运行时崩溃

2 个答案:

答案 0 :(得分:0)

为什么这不适合你:

extension P {
    init() { // Or initWithCoder since it's a ViewController?
        print("test")
        self.init()
    }
}

答案 1 :(得分:0)

由于您已使用协议扩展来定义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()
    }
}

都有效。