Swift中的纯类协议

我希望我的一些类(不是全部)使用文档中的“仅限于类的协议” 。 我在做什么

protocol RefreshData: class, ClassA, ClassB { func updateController() } 

我得到的错误

 non class type 'RefreshData cannot inherit from classA non class type 'RefreshData cannot inherit from classB 

我不确定我是否完全按照文档。 有没有人有任何想法呢?

Swift 4允许你组合types,所以你可以有你的协议,然后创build,例如,一个types别名,以结合它与特定的类要求。

对于(一个人为的)例子:

 typealias PresentableVC = UIViewController & Presentable 

对于提供的代码:

问题是,你试图限制到特定的类,而Swift不能这样做(目前无论如何)。 您只能限制类并从其他协议inheritance。 你的语法是用于协议inheritance,但是你想把它用作类的限制。

请注意,类协议的目的是:

当协议要求定义的行为假设或要求一致性types具有引用语义而不是值语义时,使用类别专用协议。

ChrisWain提供的答案是正确的。 我只是在这里添加更多的细节。

定义一个协议

你必须区分声明protocol的概念(可用于类)

 protocol RefreshData: class { func updateController() } 

定义一个类

从遵守你的课程到协议的概念

 class ClassA: RefreshData { func updateController() { } } 

符合你不拥有的课程

有时候你想要一个类符合一个协议,但你不拥有这个类的源代码。 在这种情况下,您可以使用extension

 extension ClassB: RefreshData { func updateController() { } } 

最新版本的Swift可以做到! 我会做一个协议和协议扩展,目标是你想要的类! (限制扩展到特定的类)

  protocol Movable { func moveForward() func moveBackward() } extension Movable where Self: Car { func moveForward() { self.location.x += 10; } func moveBackward() { self.location.x -= 10; } } extension Movable where Self: Bike { func moveForward() { self.x += 1; } func moveBackward() { self.x -= 1; } } class Car: Movable { var location: CGPoint init(atLocation location: CGPoint) { self.location = location } } class Bike: Movable { var x: Int init(atX x: Int) { self.x = x } } 
 protocol RefreshData : class { func updateController() } class ClassA : RefreshData { func updateController() {} } class ClassB : RefreshData { func updateController() {} }