2016-02-01 16 views
23

採納我想這個協議:如何要求的協議只能由一個特定的類

protocol AddsMoreCommands { 
    /* ... */ 
} 

只能由從類UIViewController繼承的類被採納。 This page告訴我,我可以指定它只是由一類通過(而不是一個結構),通過寫

protocol AddsMoreCommands: class { 
} 

,但我看不出如何來要求它只能通過一個特定的類採納。 That page later談到將where子句添加到協議擴展來檢查一致性,但我看不出如何適應這一點。

extension AddsMoreCommands where /* what */ { 
} 

有沒有辦法做到這一點? 謝謝!

回答

44
protocol AddsMoreCommands: class { 
    // Code 
} 

extension AddsMoreCommands where Self: UIViewController { 
    // Code 
} 
+1

我等近了吧......我寫的'self',而不是'自我':-(非常感謝你,這工作正常! – emrys57

+0

是啊:) 我認爲這是自我的點 – Roee84

+0

對我來說,這會導致一些語法奇怪,當我與鑄造一起使用這個。 –

11

這也可以不帶擴展名來實現:

protocol AddsMoreCommands: class where Self: UIViewController { 
    // code 
} 

EDITED:作爲Zig指出,這似乎產生上的Xcode 9.1警告。目前在Swift項目(SR-6265)上報告了一個刪除警告的問題,我會密切注意並相應地更新答案。

+0

巧合的是,我點擊了一個兩歲的問題,並找到了一個小時前發佈的完美解決方案 –

+0

Xcode 9.1現在給了我一個關於這種說法的警告: 冗餘佈局約束'Self':'AnyObject'。 佈局約束約束'自我':'AnyObject'隱含在這裏。 將我的代碼更改爲接受的答案的格式似乎更多gooder。 – Zig

+0

從Xcode 9.1開始,純類協議現在使用'AnyObject'而不是'class'。 '協議AddsMoreCommands:AnyObject其中Self:UIViewController {// code}' – dodgio

4

因爲在以前的答案的問題,我結束了這個聲明的:

protocol AddsMoreCommands where Self : UIViewController { 
    // protocol stuff here 
} 

在Xcode 9.1沒有警告

相關問題