我想要这个协议:
protocol AddsMoreCommands {
/* ... */
}
仅从继承自类UIViewController
的类中采用。 This page告诉我,我可以通过编写
protocol AddsMoreCommands: class {
}
但是我看不出如何要求它只被特定的类所采用。 That page later谈到将where
条款添加到协议扩展中以检查一致性,但我看不出如何调整它。
extension AddsMoreCommands where /* what */ {
}
有办法做到这一点吗? 谢谢!
答案 0 :(得分:92)
protocol AddsMoreCommands: class {
// Code
}
extension AddsMoreCommands where Self: UIViewController {
// Code
}
答案 1 :(得分:61)
这也可以在没有扩展名的情况下实现:
protocol AddsMoreCommands: class where Self: UIViewController {
// code
}
EDITED 2017/11/04 :正如Zig指出的那样,这似乎会在Xcode 9.1上产生警告。目前,Swift项目(SR-6265)报告了一个问题,要求删除警告,我会密切关注并相应地更新答案。
EDITED 2018/09/29 :如果存储实例的变量需要较弱(例如委托),则需要class
。如果您不需要弱变量,则可以省略class
,只需编写以下内容即可获得警告:
protocol AddsMoreCommands where Self: UIViewController {
// code
}
答案 2 :(得分:42)
由于上一个答案中存在问题,我最终得到了这个声明:
findByName
Xcode 9.1中没有警告
答案 3 :(得分:14)
现在,在 Swift 5 中,您可以通过以下方式实现此目标:
protocol AddsMoreCommands: UIViewController {
/* ... */
}
非常方便。