2015-09-28 70 views
3

當在操場上玩協議擴展時,我遇到了奇怪的錯誤。更確切地說,我宣佈的協議,並以下列方式使用它作爲類型: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() 
    } 
} 

但是,這給我下面的編譯時錯誤,而我打電話invokeCSpecificController

@opened(「70A8B09C-65E3-11E5-9A8E-6C40 088AF546「)InvokeProtocol'不是'SpecificController'的子類型

我剛剛跳到Swift 2.0,這是我第一次看到以@opened開頭的錯誤。這是什麼意思?這是一個已知的bug等待修復嗎?如果是這樣,你們有任何解決方法嗎?

+0

方法如果您刪除'Where Self:SpecificController'它將起作用。錯誤信息對我有意義。你不能這樣擴展它,因爲你的'SpecificController'沒有實現'InvokeProtocol'協議。 – Adam

+0

@Adam那麼爲什麼我需要協議擴展呢?我想只能從'SpecificController'中調用'invokeC'方法,而不能從其他採用'InvokeProtocol'的類中調用。 –

回答

2

回覆您的評論。這是可以實現的。你只是沒有首先實現協議。下面的工作:

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

我仍然想使用協議作爲類型。那麼@opened錯誤呢? –

+0

「使用協議作爲類型」是什麼意思?對於'打開'錯誤,也許你應該提出另一個問題。 – Adam

+0

將協議作爲類型我的意思是直接使用協議對象e.x'var invoker:InvokeProtocol?'。至於'@打開'我看到這是一個很好的線程,因爲這個問題產生了錯誤 –

0

我猜where Self: SpecificController,該Self意味着var invoke: InvokeProtocol?

如果invoke符合協議和invokeSpecificController,即invoke可以調用一個名爲invokeC()