Что такое ключевое слово open в Swift?

334

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

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

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

Clashsoft
источник
2
Возможно, связано: stackoverflow.com/questions/24003918/… («В чем разница между openи public?»)
Ахмад Ф.
Примечание: ключевое слово «open» происходит от понятия «открыт для расширения, закрыт для модификации»
Саззад Хисейн Хан

Ответы:

572

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

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

Коротко:

  • openКласс доступен и подклассы вне определяющего модуля. Член openкласса доступен и может быть переопределен вне определяющего модуля.
  • publicКласс доступен , но не подклассы вне определяющего модуля. Член publicкласса доступен, но не может быть переопределен вне определяющего модуля.

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

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

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

Для большего количества примеров и деталей, посмотрите на SE-0117 .

Мартин Р
источник
16
Так что publicв Swift 3 это как public finalв Swift 2, и openэто как public?
Clashsoft
16
@Clashsoft: «open» в Swift 3 похож на «public» в Swift 2. «public» в Swift 3 не имеет эквивалента в Swift 2. (Конечный класс вообще не может быть разделен на подклассы, даже в одном модуле.)
Martin R
59
Это смешно нелогично. Спасибо за резюме.
GoldenJoe
7
Согласитесь с @MikeS, и отсутствие обратной совместимости делает этот ужасный беспорядок.
HughHughTeotl
14
@MikeS apple - думай иначе, даже если в этом нет необходимости.
Варун Нат
12

Читать как открытый

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

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

Из Apple Docs :

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

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

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

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

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

Мохаммад Садик
источник
5

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

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

В классах

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

В классе

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

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

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

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

Для более подробной информации смотрите документацию Apple по контролю доступа

Saranjith
источник
1

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

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

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

Utils.printHello()
Fangming
источник
3
Этот ответ не объясняет, чем он отличается от публичного, поскольку вы можете сделать это и с публичным.
Хосе Рамирес
Нужно больше объяснений по этому поводу
доктор медицинских наук Аслам Ансари
1

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

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

Раджасекаран Гопал
источник
0

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

Уильям
источник