Swift Language
Kontrola dostępu
Szukaj…
Składnia
- projekt prywatnej klasy
- let car = Car („Ford”, model: „Escape”) // domyślnie wewnętrzny
- gatunek publiczny
- private func replaceMarketCap ()
- przesłonić wewnętrzny func setupViewView ()
- private (set) var area = 0
Uwagi
- Uwaga podstawowa:
Poniżej znajdują się trzy poziomy dostępu od najwyższego dostępu (najmniej ograniczający) do najniższego dostępu (najbardziej ograniczający)
Publiczny dostęp umożliwia dostęp do klas, struktur, zmiennych itp. Z dowolnego pliku w modelu, ale co ważniejsze poza modułem, jeśli zewnętrzny plik importuje moduł zawierający publiczny kod dostępu. Podczas tworzenia frameworku popularne jest korzystanie z publicznego dostępu.
Dostęp wewnętrzny pozwala na korzystanie z plików tylko w module encji. Wszystkie podmioty mają domyślnie poziom dostępu wewnętrznego (z kilkoma wyjątkami).
Prywatny dostęp zapobiega użyciu encji poza tym plikiem.
- Uwaga podklasy:
Podklasa nie może mieć wyższego dostępu niż jej nadklasa.
- Uwaga Gettera i Setera:
Jeśli ustawiający właściwość jest prywatny, to getter jest wewnętrzny (co jest ustawieniem domyślnym). Możesz także przypisać poziom dostępu zarówno dla gettera, jak i setera. Zasady te dotyczą również indeksów dolnych
- Uwaga ogólna:
Inne typy jednostek to: Inicjatory, Protokoły, Rozszerzenia, Generyczne i Aliasy Typów
Podstawowy przykład użycia struktury
W Swift 3 istnieje wiele poziomów dostępu. W tym przykładzie użyto ich wszystkich oprócz 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)"
}
}
Załóżmy, że myCar
został zainicjowany w następujący sposób:
let myCar = Car("Apple", model: "iCar")
Car.make (publiczny)
print(myCar.make)
Ten wydruk będzie działał wszędzie, w tym w celach importujących Car
.
Model samochodu (wewnętrzny)
print(myCar.model)
Skompiluje się, jeśli kod będzie w tym samym celu co Car
.
Car.otherName (fileprivate)
print(myCar.otherName)
Działa to tylko wtedy, gdy kod znajduje się w tym samym pliku co Car
.
Car.fullName (prywatny)
print(myCar.fullName)
Nie działa to w Swift 3. Dostęp do private
właściwości można uzyskać tylko w ramach tej samej 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)"
}
}
Jeśli jednostka ma wiele powiązanych poziomów dostępu, Swift szuka najniższego poziomu dostępu. Jeśli zmienna prywatna istnieje w klasie publicznej, będzie ona nadal uważana za prywatną.
Przykład podklasy
public class SuperClass {
private func secretMethod() {}
}
internal class SubClass: SuperClass {
override internal func secretMethod() {
super.secretMethod()
}
}
Przykład Getters and 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() {}
}