gpt4 book ai didi

ios - 作为类型扩展的 Swift 2.0 协议(protocol)

转载 作者:搜寻专家 更新时间:2023-10-31 22:48:44 26 4
gpt4 key购买 nike

在使用协议(protocol)扩展在 Playground 玩耍时,我遇到了奇怪的错误。更准确地说,我声明了一个协议(protocol)并按以下方式将其用作类型:

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' is not a subtype of 'SpecificController'

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

最佳答案

回复您的评论。这是可以实现的。您只是没有首先实现该协议(protocol)。以下将起作用:

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

关于ios - 作为类型扩展的 Swift 2.0 协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32824240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com