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

289

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

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

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

Теги:
syntax
declaration
swift3

5 ответов

505
Лучший ответ

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

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

Короче:

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

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

"open" теперь просто "более публичный, чем публичный", предоставляя очень простую и чистую модель.

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

Дополнительные примеры и подробности см. SE-0117.

  • 13
    То есть public в Swift 3 - это public final в Swift 2, а open - как public ?
  • 15
    @Clashsoft: «open» в Swift 3 похож на «public» в Swift 2. «public» в Swift 3 не имеет эквивалента в Swift 2. (Конечный класс вообще не может быть разделен на подклассы, даже в одном и том же модуле.)
Показать ещё 11 комментариев
6

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

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

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

Из Apple Docs:

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

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

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

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

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

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

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

В классах

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

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

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

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

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

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

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

1

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

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

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

Utils.printHello()
  • 1
    Этот ответ не объясняет, чем он отличается от публичного, поскольку вы можете сделать это и с публичным.
  • 0
    Нужно больше объяснений по этому поводу
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню