Файл ObjectiveC.swift
из стандартной библиотеки содержит следующие строки кода вокруг строки 228:
extension NSObject : Equatable, Hashable {
/// ...
open var hashValue: Int {
return hash
}
}
Что означает open var
в этом контексте, или что такое ключевое слово open
в целом?
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.
public
в Swift 3 - это public final
в Swift 2, а open
- как public
?
Читать как открытый
открыть для наследования в других модулях
Я повторяю открытость для наследования в других модулях. Таким образом, открытый класс открыт для создания подклассов в других модулях, которые включают определяющий модуль. Открытые переменные и функции открыты для переопределения в других модулях. Это наименее ограниченный уровень доступа. Это так же хорошо, как публичный доступ признает, что что-то публичное закрыто для наследования в других модулях.
Из Apple Docs:
Открытый доступ применяется только к классам и членам класса и отличается от открытого доступа следующим образом:
Классы с открытым доступом или любым более ограниченным уровнем доступа могут быть разделены на подклассы только в том модуле, где они определены.
Члены класса с открытым доступом или любым более ограниченным уровнем доступа могут быть переопределены подклассами только внутри модуля, в котором они определены.
Открытые классы могут быть разделены на подклассы в модуле, где они определены, и в любом модуле, который импортирует модуль, где они определены.
- Открытые члены класса могут быть переопределены подклассами в модуле, где они определены, и в любом модуле, который импортирует модуль, где они определены.
Open - это уровень доступа, был введен, чтобы налагать ограничения на наследование классов на Swift.
Это означает, что уровень доступа открытый может применяться только к классам и членам класса.
В классах
Открытый класс может быть подклассифицирован в модуле, который он определен в модулях и в модулях, которые импортируют модуль, в котором определяется класс.
В членах класса
То же самое относится к членам класса. Открытый метод может быть переопределен подклассами в модуле, который он определен в модулях и в модулях, которые импортируют модуль, в котором этот метод определен.
НЕОБХОДИМОСТЬ ЭТОГО ОБНОВЛЕНИЯ
Некоторые классы библиотек и фреймворков не предназначены для подкласса, и это может привести к неожиданному поведению. Собственная библиотека Apple также не позволит переопределять те же методы и классы,
Таким образом, после этого добавления они будут применять уровни публичного и частного доступа соответственно.
Подробнее см. Документация Apple по контролю доступа
За исключением подкласса, open class func
также доступен из любого места вашего проекта. Предположим, что вы определяете функцию открытого класса в своем классе Util, например,
open class Utils: NSObject {
open class func printHello() {
print("Hello from utils")
}
}
Затем в любом месте контроллера вашего вида вы можете просто получить доступ к этому методу, вызвав
Utils.printHello()
open предназначен только для другого модуля, например: cocoa-бобы или unit тест, мы можем наследовать или переопределять
open
иpublic
?»)