如何要求协议只能由特定类采用

时间:2016-02-01 15:09:51

标签: swift generics protocols

我想要这个协议:

protocol AddsMoreCommands {
     /* ... */
}

仅从继承自类UIViewController的类中采用。 This page告诉我,我可以通过编写

来指定它只被类(而不是结构)采用
protocol AddsMoreCommands: class {
}

但是我看不出如何要求它只被特定的类所采用。 That page later谈到将where条款添加到协议扩展中以检查一致性,但我看不出如何调整它。

extension AddsMoreCommands where /* what */ {
}

有办法做到这一点吗? 谢谢!

4 个答案:

答案 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 {
     /* ... */
}

非常方便。