當在操場上玩協議擴展時,我遇到了奇怪的錯誤。更確切地說,我宣佈的協議,並以下列方式使用它作爲類型:Swift 2.0協議作爲一種類型的擴展
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()
}
}
但是,這給我下面的編譯時錯誤,而我打電話invokeC
上SpecificController
@opened(「70A8B09C-65E3-11E5-9A8E-6C40 088AF546「)InvokeProtocol'不是'SpecificController'的子類型
我剛剛跳到Swift 2.0,這是我第一次看到以@opened開頭的錯誤。這是什麼意思?這是一個已知的bug等待修復嗎?如果是這樣,你們有任何解決方法嗎?
方法如果您刪除'Where Self:SpecificController'它將起作用。錯誤信息對我有意義。你不能這樣擴展它,因爲你的'SpecificController'沒有實現'InvokeProtocol'協議。 – Adam
@Adam那麼爲什麼我需要協議擴展呢?我想只能從'SpecificController'中調用'invokeC'方法,而不能從其他採用'InvokeProtocol'的類中調用。 –