Что такое ключевое слово 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:
Открытый доступ применяется только к классам и членам класса и отличается от открытого доступа следующим образом:
Классы с открытым доступом или любым более ограниченным уровнем доступа могут быть разделены на подклассы только в том модуле, в котором они определены.
Члены класса с открытым доступом или любым более ограниченным уровнем доступа могут быть переопределены подклассами только внутри модуля, в котором они определены.
Открытые классы могут быть разделены на подклассы внутри модуля, в котором они определены, и внутри любого модуля, который импортирует модуль, в котором они определены.
- Открытые члены класса могут быть переопределены подклассами в модуле, в котором они определены, и в любом модуле, который импортирует модуль, в котором они определены.
Open - это уровень доступа, введенный для ограничения наследования классов в Swift.
Это означает, что уровень открытого доступа может применяться только к классам и членам класса.
В классах
Открытый класс может быть разделен на подклассы в модуле, в котором он определен, и в модулях, которые импортируют модуль, в котором определен класс.
В классе
То же самое относится и к ученикам. Открытый метод может быть переопределен подклассами в модуле, в котором он определен, и в модулях, которые импортируют модуль, в котором определен метод.
НЕОБХОДИМОСТЬ ЭТОГО ОБНОВЛЕНИЯ
Некоторые классы библиотек и каркасов не предназначены для подклассов, и это может привести к непредвиденному поведению. Собственная библиотека Apple также не позволяет переопределять те же методы и классы,
Таким образом, после этого добавления они будут применять уровни общего и частного доступа соответственно.
Для более подробной информации смотрите документацию Apple по контролю доступа
open приходят играть при работе с несколькими модулями.
Открытый класс доступен и подклассифицирован вне определяющего модуля. Открытый член класса доступен и может быть переопределен вне определяющего модуля.
За исключением подкласса, open class func
также доступен из любой точки вашего проекта. Скажем, вы определяете функцию открытого класса в своем классе Util следующим образом
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
Затем в любом месте ваших контроллеров представления вы можете просто получить доступ к этому методу, вызвав
Utils.printHello()
open предназначен только для другого модуля, например: какао-бобы или модульный тест, мы можем наследовать или переопределять