![](/img/trans.png)
[英]swift 2.0 - UITextFieldDelegate protocol extension not working
[英]Swift 2.0 Protocol as a Type Extension
在带有协议扩展的游乐场玩耍时,我遇到了奇怪的错误。 更确切地说,我声明了一个协议并以下列方式将其用作类型:
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开头的错误。 这是什么意思? 这是一个等待修复的已知错误吗? 如果是这样,你们有任何解决方法吗?
回复你的评论。 这是可以实现的。 您刚刚没有实现协议。 以下将有效:
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() {
}
}
我想where Self: SpecificController
, Self
意味着var invoke: InvokeProtocol?
如果invoke
符合协议并且invoke
是SpecificController
,那么该invoke
可以调用名为invokeC()
的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.