Swift - Właściwości
Język Swift 4 zapewnia właściwości dla klasy, wyliczenia lub struktury w celu skojarzenia wartości. Właściwości można dalej podzielić na Właściwości przechowywane i Właściwości obliczone.
Różnica między właściwościami przechowywanymi i obliczonymi
Majątek składowany | Obliczona właściwość |
---|---|
Przechowuj wartości stałe i zmienne jako instancję | Oblicz wartość, zamiast ją przechowywać |
Dostarczane przez klasy i struktury | Dostarczane przez klasy, wyliczenia i struktury |
Zarówno właściwości Stored, jak i Computed są skojarzone z typem instancji. Gdy właściwości są skojarzone z wartościami typu, jest to definiowane jako „Właściwości typu”. Właściwości przechowywane i obliczane są zwykle skojarzone z wystąpieniami określonego typu. Jednak właściwości mogą być również skojarzone z samym typem. Takie właściwości są znane jako właściwości typu. Korzysta się również z obserwatorów nieruchomości
- Aby obserwować wartość przechowywanych właściwości
- Aby obserwować właściwość dziedziczonej podklasy pochodzącej z nadklasy
Przechowywane właściwości
Swift 4 wprowadza koncepcję Stored Property do przechowywania wystąpień stałych i zmiennych. Przechowywane właściwości stałych są definiowane przez słowo kluczowe „let”, a przechowywane właściwości zmiennych za pomocą słowa kluczowego „var”.
- Podczas definiowania Właściwość przechowywana zapewnia `` wartość domyślną ''
- Podczas inicjalizacji użytkownik może inicjalizować i modyfikować wartości początkowe
struct Number {
var digits: Int
let pi = 3.1415
}
var n = Number(digits: 12345)
n.digits = 67
print("\(n.digits)")
print("\(n.pi)")
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
67
3.1415
Rozważ następujący wiersz w powyższym kodzie -
let pi = 3.1415
Tutaj zmienna pi jest inicjalizowana jako przechowywana wartość właściwości z instancją pi = 3,1415. Tak więc za każdym razem, gdy odwołujemy się do instancji, będzie ona sama przechowywać wartość 3,1415.
Inną metodą przechowywania właściwości jest posiadanie stałych struktur. Zatem cała instancja struktur będzie traktowana jako „Przechowywane właściwości stałych”.
struct Number {
var digits: Int
let numbers = 3.1415
}
var n = Number(digits: 12345)
n.digits = 67
print("\(n.digits)")
print("\(n.numbers)")
n.numbers = 8.7
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
error: cannot assign to 'numbers' in 'n'
n.numbers = 8.7
Zamiast ponownej inicjalizacji „liczby” do 8,7 zwróci komunikat o błędzie wskazujący, że „liczba” jest zadeklarowana jako stała.
Leniwa nieruchomość składowana
Swift 4 zapewnia elastyczną właściwość o nazwie „Lazy Stored Property”, w której nie oblicza wartości początkowych, gdy zmienna jest inicjowana po raz pierwszy. Modyfikator „leniwy” jest używany przed deklaracją zmiennej, aby był przechowywany jako leniwa właściwość.
Leniwe właściwości są używane -
- Aby opóźnić tworzenie obiektów.
- Gdy właściwość jest zależna od innych części klasy, które nie są jeszcze znane
class sample {
lazy var no = number() // `var` declaration is required.
}
class number {
var name = "Swift 4"
}
var firstsample = sample()
print(firstsample.no.name)
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
Swift 4
Zmienne instancji
W celu C właściwości przechowywane mają również zmienne instancji do celów kopii zapasowej w celu przechowywania wartości zadeklarowanych we właściwości przechowywanej.
Swift 4 integruje obie te koncepcje w jednej deklaracji „przechowywanej własności”. Zamiast posiadania odpowiedniej zmiennej instancji i wartości kopii zapasowej „właściwość przechowywana” zawiera wszystkie zintegrowane informacje zdefiniowane w jednym miejscu na temat właściwości zmiennych według nazwy zmiennej, typu danych i funkcji zarządzania pamięcią.
Obliczone właściwości
Zamiast przechowywać wartości obliczone, właściwości zapewniają metodę pobierającą i opcjonalną metodę ustawiającą do pobierania i ustawiania innych właściwości i wartości pośrednio.
class sample {
var no1 = 0.0, no2 = 0.0
var length = 300.0, breadth = 150.0
var middle: (Double, Double) {
get {
return (length / 2, breadth / 2)
}
set(axis){
no1 = axis.0 - (length / 2)
no2 = axis.1 - (breadth / 2)
}
}
}
var result = sample()
print(result.middle)
result.middle = (0.0, 10.0)
print(result.no1)
print(result.no2)
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
(150.0, 75.0)
-150.0
-65.0
Gdy obliczona właściwość pozostawi nową wartość jako niezdefiniowaną, wartość domyślna zostanie ustawiona dla tej konkretnej zmiennej.
Obliczone właściwości jako właściwości tylko do odczytu
Właściwość tylko do odczytu we właściwości obliczonej jest definiowana jako właściwość z funkcją pobierającą, ale bez metody ustawiającej. Jest zawsze używany do zwracania wartości. Dostęp do zmiennych dalej uzyskuje się poprzez „.” Składnia, ale nie można jej ustawić na inną wartość.
class film {
var head = ""
var duration = 0.0
var metaInfo: [String:String] {
return [
"head": self.head,
"duration":"\(self.duration)"
]
}
}
var movie = film()
movie.head = "Swift 4 Properties"
movie.duration = 3.09
print(movie.metaInfo["head"]!)
print(movie.metaInfo["duration"]!)
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
Swift 4 Properties
3.09
Obliczone właściwości jako obserwatory właściwości
W języku Swift 4 do obserwowania wartości właściwości i reagowania na nie używane są obserwatory właściwości. Za każdym razem, gdy ustawiane są wartości właściwości, wywoływane są obserwatory właściwości. Oprócz leniwych przechowywanych właściwości możemy dodawać obserwatory właściwości do właściwości „dziedziczonej” za pomocą metody „przesłaniania”.
Obserwatory właściwości mogą być definiowane przez jedną z nich
Przed zapisaniem wartości - willset
Po zapisaniu nowej wartości - didset
Gdy właściwość jest ustawiona w inicjatorze, nie można wywołać obserwatorów willset i didset.
class Samplepgm {
var counter: Int = 0 {
willSet(newTotal){
print("Total Counter is: \(newTotal)")
}
didSet {
if counter > oldValue {
print("Newly Added Counter \(counter - oldValue)")
}
}
}
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700
Zmienne lokalne i globalne
Do obliczania i obserwacji właściwości deklarowane są zmienne lokalne i globalne.
Zmienne lokalne | Zmienne globalne |
---|---|
Zmienne zdefiniowane w ramach funkcji, metody lub kontekstu zamknięcia. | Zmienne zdefiniowane poza kontekstem funkcji, metody, zamknięcia lub typu. |
Służy do przechowywania i pobierania wartości. | Służy do przechowywania i pobierania wartości. |
Przechowywane właściwości służą do pobierania i ustawiania wartości. | Przechowywane właściwości służą do pobierania i ustawiania wartości. |
Wykorzystywane są również obliczone właściwości. | Wykorzystywane są również obliczone właściwości. |
Właściwości typu
Właściwości są zdefiniowane w sekcji Definicja typu za pomocą nawiasów klamrowych {}, a zakres zmiennych został również zdefiniowany wcześniej. Do definiowania właściwości typu dla typów wartości używane jest słowo kluczowe „static”, a dla typów klas - słowo kluczowe „class”.
Składnia
struct Structname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// return an Int value here
}
}
enum Enumname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// return an Int value here
}
}
class Classname {
class var computedTypeProperty: Int {
// return an Int value here
}
}
Zapytania i ustawianie właściwości
Podobnie jak właściwości instancji Właściwości typu są odpytywane i ustawiane za pomocą „.” Składnia dotyczy samego typu zamiast wskazywać na instancję.
struct StudMarks {
static let markCount = 97
static var totalCount = 0
var InternalMarks: Int = 0 {
didSet {
if InternalMarks > StudMarks.markCount {
InternalMarks = StudMarks.markCount
}
if InternalMarks > StudMarks.totalCount {
StudMarks.totalCount = InternalMarks
}
}
}
}
var stud1Mark1 = StudMarks()
var stud1Mark2 = StudMarks()
stud1Mark1.InternalMarks = 98
print(stud1Mark1.InternalMarks)
stud1Mark2.InternalMarks = 87
print(stud1Mark2.InternalMarks)
Gdy uruchomimy powyższy program za pomocą placu zabaw, otrzymamy następujący wynik -
97
87