【问题标题】:Swift 2.0 Protocol as a Type ExtensionSwift 2.0 协议作为类型扩展
【发布时间】:2015-09-28 13:26:55
【问题描述】:

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

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 开头的错误。这是什么意思?这是一个等待修复的已知错误吗?如果是这样,你们有什么解决方法吗?

【问题讨论】:

  • 如果您删除 where Self: SpecificController 它将起作用。错误消息对我来说很有意义。你不能这样扩展它,因为你的 SpecificController 没有实现 InvokeProtocol 协议。
  • @Adam 那我为什么需要协议扩展呢?我希望只能从SpecificController 调用invokeC 方法,而不能从采用“InvokeProtocol”的其他类调用。

标签: ios swift inheritance protocols protocol-extension


【解决方案1】:

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

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

【讨论】:

  • 我还是想用protocol作为类型。那么@opened 错误呢?
  • “将协议用作类型”是什么意思?对于@opened 错误,也许你应该问另一个问题。
  • 将协议作为一种类型,我的意思是直接使用协议对象 e.x var invoker : InvokeProtocol? 。至于@opened,我认为这是一个很好的线程,因为这个问题正在产生该错误
  • var invoker : InvokeProtocol? 是完全可能的。那不是问题。问题是您只想为特定的调用者扩展协议。这在 Swift 中是不可能的,这在我知道的任何语言中都是不可能的。
【解决方案2】:

我猜where Self: SpecificControllerSelf 的意思是var invoke: InvokeProtocol?

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

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2017-04-24
    相关资源
    最近更新 更多