Swift Language
Контроль доступа
Поиск…
Синтаксис
- проект частного класса
- let car = Car («Форд», модель: «Escape») // default internal
- public enum Жанр
- private func calculateMarketCap ()
- переопределить внутреннюю функцию func setupView ()
- private (set) var area = 0
замечания
- Основное замечание:
Ниже приведены три уровня доступа от наивысшего доступа (наименее ограничивающий) до самого низкого доступа (наиболее ограничительного)
Открытый доступ позволяет получить доступ к классам, структурам, переменным и т. Д. Из любого файла в модели, но, что более важно, вне модуля, если внешний файл импортирует модуль, содержащий общедоступный код доступа. Популярно использовать публичный доступ при создании фреймворка.
Внутренний доступ позволяет файлам только с модулем сущностей использовать сущности. По умолчанию все объекты имеют внутренний уровень доступа (за некоторыми исключениями).
Частный доступ запрещает использование объекта вне этого файла.
- Подкласс Замечание:
Подкласс не может иметь более высокий доступ, чем его суперкласс.
- Getter & Setter Примечание:
Если установщик свойств является приватным, то getter является внутренним (что является значением по умолчанию). Также вы можете назначить уровень доступа как для получателя, так и для сеттера. Эти принципы также применимы и к индексам
- Общее замечание:
Другие типы объектов включают: Инициализаторы, Протоколы, Расширения, Дженерики и Типовые Псевдонимы
Основной пример с использованием Struct
В Swift 3 есть несколько уровней доступа. В этом примере используются все, кроме open
:
public struct Car {
public let make: String
let model: String //Optional keyword: will automatically be "internal"
private let fullName: String
fileprivate var otherName: String
public init(_ make: String, model: String) {
self.make = make
self.model = model
self.fullName = "\(make)\(model)"
self.otherName = "\(model) - \(make)"
}
}
Предположим, что myCar
был инициализирован следующим образом:
let myCar = Car("Apple", model: "iCar")
Car.make (общедоступный)
print(myCar.make)
Эта печать будет работать везде, включая цели, которые импортируют Car
.
Car.model (внутренний)
print(myCar.model)
Это будет скомпилировано, если код находится в той же цели, что и Car
.
Car.otherName (fileprivate)
print(myCar.otherName)
Это будет работать, только если код находится в том же файле, что и Car
.
Car.fullName (частный)
print(myCar.fullName)
Это не будет работать в Swift 3. Доступ к private
свойствам возможен только в пределах одной и той же struct
/ class
.
public struct Car {
public let make: String //public
let model: String //internal
private let fullName: String! //private
public init(_ make: String, model model: String) {
self.make = make
self.model = model
self.fullName = "\(make)\(model)"
}
}
Если объект имеет несколько связанных уровней доступа, Swift ищет самый низкий уровень доступа. Если частная переменная существует в открытом классе, переменная все равно будет считаться закрытой.
Пример подкласса
public class SuperClass {
private func secretMethod() {}
}
internal class SubClass: SuperClass {
override internal func secretMethod() {
super.secretMethod()
}
}
Пример Getters и Setters
struct Square {
private(set) var area = 0
var side: Int = 0 {
didSet {
area = side*side
}
}
}
public struct Square {
public private(set) var area = 0
public var side: Int = 0 {
didSet {
area = side*side
}
}
public init() {}
}