繁体   English   中英

Swift 2.0协议作为类型扩展

[英]Swift 2.0 Protocol as a Type Extension

在带有协议扩展的游乐场玩耍时,我遇到了奇怪的错误。 更确切地说,我声明了一个协议并以下列方式将其用作类型:

protocol InvokeProtocol{

    func invokeA()

    func invokeB()
}

class Controller{

    var invoker : InvokeProtocol?

    func methodA(){

        invoker?.invokeA()
    }

    func methodB(){

        invoker?.invokeB()
    }
}

我接下来要做的是创建一个Controller的子类,并尝试为该特定类型扩展InvokeProtocol

extension InvokeProtocol where Self: SpecificController{

    func invokeC(){

    }

}

class SpecificController : Controller {

    override func methodA() {
        super.methodA()
    }

    override func methodB() {
        super.methodB()
    }

    func methodC(){
        invoker?.invokeC()   
    }
}

但是当我尝试在SpecificController上调用invokeC ,这给了我以下编译时错误

@opened(“70A8B09C-65E3-11E5-9A8E-6C40088AF546”)InvokeProtocol'不是'SpecificController'的子类型

我刚刚跳到Swift 2.0,这是我第一次看到以@opened开头的错误。 这是什么意思? 这是一个等待修复的已知错误吗? 如果是这样,你们有任何解决方法吗?

回复你的评论。 这是可以实现的。 您刚刚没有实现协议。 以下将有效:

protocol InvokeProtocol {

    func invokeA()

    func invokeB()
}

class Controller : InvokeProtocol {

    func invokeA(){
    }

    func invokeB() {
    }
}

extension InvokeProtocol where Self: SpecificController{

    func invokeC() {

    }

}

class SpecificController : Controller {

    override func invokeA() {
        super.invokeA()
    }

    override func invokeB() {
        super.invokeB()
    }

    func invokeC() {
    }
}

我想where Self: SpecificControllerSelf意味着var invoke: InvokeProtocol?

如果invoke符合协议并且invokeSpecificController ,那么该invoke可以调用名为invokeC()的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM