【发布时间】: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