2016-08-22 2 views
1

после обновления до последней Xcode 8, я получаю эту ошибку:Xcode 8: Не могу наследовать от не открытого класса

Cannot inherit from non-open class ‘WDBaseViewController’ outside of its defining module

Мой класс объявлен как этого

public class ProfileViewController: WDBaseViewController { 
} 

Но я Жду» t изменить структуру.

+0

Базовый класс 'WDBaseViewController' должен быть определен как' open', а не 'public' в используемой структуре. –

+0

См. Также [Что такое ключевое слово 'open' в Swift?] (Http://stackoverflow.com/questions/38947101/what-is-the-open-keyword-in-swift) и Xcode 8 beta 6 Release Заметки. –

+0

Да, я нашел его. Благодарю. –

ответ

9

Короткий ответ:

Чтобы быть в состоянии подкласса базового класса WDBaseViewController должен быть определен как open вместо public в рамках используемого вами.

open class WDBaseViewController { 
    ... 
} 

Если это внутренняя структура вы можете сделать это самостоятельно, в противном случае вам придется ждать, пока автор, чтобы поддержать Swift 3.

Длинный ответ:

Swift 3 приносит значительный изменения в управлении доступом.

Swift 2 только 3 уровня доступа:

  • private: объекты доступны только в пределах исходного файла, в котором они определены.
  • internal: объекты доступны для всего модуля, который включает определение.
  • public: объекты предназначены для использования в качестве API и могут быть доступны любым файлом, который импортирует модуль.

Swift 3 добавляет еще 2 уровней доступа (open и fileprivate) и изменение значения private:

  • private: символ виден только в пределах текущей декларации.
  • fileprivate: символ, видимый в текущем файле.
  • internal: символ, видимый в текущем модуле.
  • public: символ, видимый вне текущего модуля.
  • open: для класса или функции, подлежащей подклассу или переопределенной за пределами текущего модуля.
Смежные вопросы