2016-08-14 9 views
233

ObjectiveC.swift файла из стандартной библиотеки содержит следующие несколько строк коды вокруг линии 228:Что такое ключевое слово 'open' в Swift?

extension NSObject : Equatable, Hashable { 
    /// ... 
    open var hashValue: Int { 
    return hash 
    } 
} 

Что open var означает в этом контексте, или что такое open ключевого слова в целом?

ответ

406

open новый уровень доступа в Swift 3, введена с реализацией из

Он доступен с снимку Swift 3 от 7 августа 2016 года, и Xcode 8 beta 6.

Вкратце:

  • open класс доступен и подклассы вне определяющего модуля. Элемент класса open является доступным и overridable вне определяющего модуля.
  • publicкласс доступен но не подклассы за пределами определяющего модуля. A public член класса Доступно, но не переопределяется за пределами определяющего модуля.

Так open что public раньше в предыдущих Swift релизах и доступ public был ограничен. Или, как Крис Латтнер ставит его в SE-0177: Allow distinguishing between public access and public overridability:

«открыть» теперь просто «более открытой, чем общественность», которая обеспечивает очень простую и чистую модель.

В вашем примере, open var hashValue свойство, которое доступно и может быть переопределен в NSObject подклассов.

Для получения более подробных примеров и подробностей ознакомьтесь с SE-0117.

+9

Таким образом, 'public' в Swift 3 подобен' public final' в Swift 2, а 'open' подобен' public'? – Clashsoft

+14

@Clashsoft: «open» в Swift 3 как «public» в Swift 2. «public» в Swift 3 не имеет эквивалента в Swift 2. (Последний класс не может быть подклассом вообще, даже в том же модуле.) –

+0

Ну ладно, спасибо за разъяснение. – Clashsoft

3

Open - это уровень доступа, введенный для введения ограничений на наследование классов на Swift.

Это означает, что уровень доступа открытого может быть применен только к классам и членам класса.

В классах

Открытый класс может быть подклассов в модуле он определен в и в модулях, которые импортируют модуль, в котором определен класс.

В членах класса

То же самое относится и к членам класса. Открытый метод может быть переопределен подклассами в модуле, который он определен в модулях и в модулях, которые импортируют модуль, в котором этот метод определен.

НЕОБХОДИМОСТЬ ДЛЯ ЭТОГО ОБНОВЛЕНИЯ

Некоторые классы библиотек и фреймворков не предназначены для подклассов и это может привести к непредсказуемому поведению. Собственная библиотека Apple также не позволит переопределять те же методы и классы,

Таким образом, после этого добавления они будут применять уровни общего и частного доступа соответственно.

Для получения более подробной информации имеет вид на Apple Documentation on Access Control

2

для подкласса исключения open class func также доступна из любого места в вашем проекте. Допустим, вы определяете функцию открытого класса в классе Util как этот

open class Utils: NSObject { 
    open class func printHello() { 
     print("Hello from utils") 
    } 
} 

Тогда в любом месте ваших контроллеров просмотра, вы можете просто получить доступ этот метод вызова

Utils.printHello() 
+0

Этот ответ не объясняет, как он отличается от общедоступного, так как вы можете сделать это тоже публично. –

+0

Нужно еще несколько объяснений по этому поводу –

3

Read открыт в

открыт для наследования в других модулях

Я повторяю open для наследования в других модулях. Таким образом, открытый класс открыт для подкласса в других модулях, которые включают определяющий модуль. Открытые вары и функции открыты для переопределения в других модулях. Его наименее ограничительный уровень доступа. Это так же хорошо, как публичный доступ, признать, что что-то публичное закрыто для наследования в других модулях.

От Apple Docs:

Открытый доступ применяется только к классам и членам класса, и она отличается от публичного доступа следующим образом:

  1. Классы с открытым доступом, или любой более ограничительный уровень доступа , могут быть подклассифицированы только в пределах модуля, где они определены.

  2. Члены класса с открытым доступом, или любой более ограничительным уровнем доступа, может быть перекрыты подклассами только в модуле где они определены .

  3. Открытые классы могут быть подклассы в пределах модуля, где они определены, и внутри любого модуля, который импортирует модуль, где они определены.

  4. Открытые члены класса могут быть переопределены подклассами в пределах модуля, где они определены, и в пределах любого модуля, который импортирует модуль, в котором они определены.

 Смежные вопросы

  • Нет связанных вопросов^_^