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

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

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

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

4 ответа

Решение

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.

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

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

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

Из Apple Docs:

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

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

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

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

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

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

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

В классах

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

В классе

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

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

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

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

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

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

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

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

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

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

Utils.printHello()

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

Другие вопросы по тегам