Class-Only Protocols in Swift

tonytran picture tonytran · Jul 8, 2016 · Viewed 25.5k times · Source

I want some of my classes (not all) to conform using 'Class-Only Protocols' from docs. What I am doing is

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

and I am getting the errors

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

I'm not sure I am following exactly as in the docs. Does anyone have any ideas about this?

Answer

Wain picture Wain · Jul 8, 2016

Swift 4 allows you to combine types, so you can have your protocol and then create, for example, a type alias to combine it with a specific class requirement.

For (a contrived) example:

typealias PresentableVC = UIViewController & Presentable

For the presented code:

The problem is that you're trying to limit to specific classes and Swift can't do that (at the moment anyway). You can only limit to classes and inherit from other protocols. Your syntax is for protocol inheritance but you're trying to use it as a class limitation.

Note that the purpose of class protocols is:

Use a class-only protocol when the behavior defined by that protocol’s requirements assumes or requires that a conforming type has reference semantics rather than value semantics.