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

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

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

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

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

  • SE-0117 Позволить различать доступ общественности и общедоступность

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

Вкратце:

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

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

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

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

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

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

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

В classах

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

В членах classа

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

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

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

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

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

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

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

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

Из Apple Docs :

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

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

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

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

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

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

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

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

 Utils.printHello() 
  • Строки C ++: vs. *
  • Возможно ли сделать анонимные внутренние classы в Java static?
  • Подсветка синтаксиса Android?
  • Почему некоторые люди предпочитают «T const &» над «const T &»?
  • Вопросительный знак и двоеточие в JavaScript
  • Скобки, окружающие возвращаемые значения
  • Можете ли вы использовать конечную запятую в объекте JSON?
  • Почему равный оператор не работает, если он не окружен пространством?
  • Почему инициализация списка (с использованием фигурных скобок) лучше, чем альтернативы?
  • В объявлении функции C, что делает «...» как последний параметр?
  • Изменение списка с использованием нотации среза
  • Interesting Posts
    Давайте будем гением компьютера.