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.xvar invoker:InvokeProtocol?
。至于@opened
我认为这是一个很好的线程,因为这个问题产生的错误var invoker:InvokeProtocol?
是完全可能的。这不是问题。问题是您只想为特定的调用者扩展协议。这在Swift中是不可能的,这在我所知道的任何语言中都是不可能的。