Файл ObjectiveC.swift из стандартной библиотеки содержит следующие несколько строк кода около строки 228:

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

Что означает в данном контексте open var или что вообще такое ключевое слово open?

Ответы (5)

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

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

Короче:

  • Класс открытый - это доступный и подкласс за пределами определяющий модуль. Член класса открытый - это доступный и переопределяемый вне определяющего модуля.
  • A общедоступный класс доступный, но не подклассифицируется за пределами определяющий модуль. A public член класса доступен, но не переопределяется вне определяющего модуля.

Итак, open - это то, что public было в предыдущем Релизы Swift и доступ к public был ограничен. Или, как выразился Крис Латтнер SE-0177: Разрешить различать публичный доступ и публичное перекрытие:

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

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

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

открыт только для другого модуля, например: какао-стручки или модульный тест, мы можем наследовать или переопределять

open вступает в игру при работе с несколькими модулями.

открытый класс доступен и подклассифицируется вне определяющего модуля. Открытый член класса доступен и переопределяется вне определяющего модуля.

Открыть как

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

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

Из Apple Docs:

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

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

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

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

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

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

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

В классах

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

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

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

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

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

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

Подробнее см. Документацию Apple по контролю доступа

2022 WebDevInsider