Ios 作为类型扩展的Swift 2.0协议

Ios 作为类型扩展的Swift 2.0协议,ios,swift,inheritance,protocols,protocol-extension,Ios,Swift,Inheritance,Protocols,Protocol Extension,在操场上玩协议扩展时,我遇到了一个奇怪的错误。更准确地说,我声明了一个协议,并以以下方式将其用作类型: protocol InvokeProtocol{ func invokeA() func invokeB() } class Controller{ var invoker : InvokeProtocol? func methodA(){ invoker?.invokeA() } func methodB(){

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

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

@已打开(“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() {
    }
}

我猜
其中Self:SpecificController
Self
意味着
var invoke:InvokeProtocol?


如果
invoke
符合协议并且
invoke
SpecificController
,那么
invoke
可以调用名为
invokeC()

的方法,如果您删除
where Self:SpecificController
它将工作。这个错误消息对我来说很有意义。您不能这样扩展它,因为您的
SpecificController
没有实现
InvokeProtocol
协议。@Adam那么我为什么需要协议扩展呢?我希望只能从
SpecificController
调用
invokeC
方法,而不能从采用“InvokeProtocol”的其他类调用。我仍然希望将协议用作一种类型。那么@opened error呢?您所说的“将协议用作类型”是什么意思?对于
@opened
错误,也许您应该问另一个问题。协议作为一种类型,我的意思是直接使用协议对象e.x
var invoker:InvokeProtocol?
。至于
@opened
我认为这是一个很好的线程,因为这个问题产生的错误
var invoker:InvokeProtocol?
是完全可能的。这不是问题。问题是您只想为特定的调用者扩展协议。这在Swift中是不可能的,这在我所知道的任何语言中都是不可能的。