Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Cannot inherit from non-open class" swift

As of Xcode 8 beta 6 I now get the compile error "Cannot inherit from non-open class (Class)" outside of its defining module"

The class I was inheriting from was part of a separate Swift framework but my project compiled for Xcode 8 beta 5. What do I need to change to get my project to compile again?

like image 569
LOP_Luke Avatar asked Aug 16 '16 15:08

LOP_Luke


2 Answers

Found the answer myself.

In Swift 3 you can now mark a class as open instead of public this allows files outside of the module to subclass that class.

Simply replace public in your module class with open.

Reference here.

like image 123
LOP_Luke Avatar answered Nov 12 '22 14:11

LOP_Luke


The class you inherit from needs to be defined as open instead of public.

A bit more context on the changes to access control in Swift 3:

Swift 2 only had 3 access levels:

  • private: entities are available only from within the source file where they are defined.
  • internal: entities are available to the entire module that includes the definition.
  • public: entities are intended for use as API, and can be accessed by any file that imports the module.

Swift 3 is adding 2 more access levels (open and fileprivate) and changing the meaning of private:

  • private: symbol visible within the current declaration only.
  • fileprivate: symbol visible within the current file.
  • internal: symbol visible within the current module or default access modifier.
  • public: symbol visible outside the current module.
  • open: for class or function to be subclassed or overridden outside the current module.
like image 40
Yann Bodson Avatar answered Nov 12 '22 14:11

Yann Bodson