3

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

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()   
    }
}

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

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

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

4

2 回答 2

2

回复您的评论。这是可以实现的。您只是一开始还没有实现该协议。以下将起作用:

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() {
    }
}
于 2015-09-28T13:42:56.237 回答
0

我猜是where Self: SpecificControllerSelf手段var invoke: InvokeProtocol?

如果invoke符合协议并且invokeis SpecificController,则invoke可以调用名为的方法invokeC()

于 2015-12-03T09:18:32.870 回答