2016-02-01 14 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没有警告

相关问题