Swift – Nieruchomości

ogłoszenia

język Swift 4 zapewnia właściwości dla klasy, wyliczenia lub struktury do kojarzenia wartości. Właściwości można dalej klasyfikować do Właściwości przechowywanych i właściwości obliczeniowych.

różnica między właściwościami przechowywanymi a właściwościami obliczonymi

przechowywana nieruchomość obliczana nieruchomość
przechowuj wartości stałe i zmienne jako instancję Oblicz wartość, a nie przechowuj wartość
zapewnione przez klasy i struktury zapewnione przez klasy, wyliczenia i struktury

zarówno przechowywane, jak i obliczone właściwości są powiązane z typem instancji. Gdy właściwości są powiązane z wartościami typu, to jest definiowane jako „właściwości typu”. Przechowywane i obliczane właściwości są zwykle związane z wystąpieniami określonego typu. Jednak właściwości mogą być również powiązane z samym typem. Takie właściwości są znane jako właściwości typu. Obserwatorzy właściwości są również używane

  • do obserwacji wartości przechowywanych właściwości
  • do obserwacji właściwości dziedziczonej podklasy pochodzącej z klasy nadrzędnej

przechowywanych właściwości

Swift 4 wprowadza koncepcję przechowywanych właściwości do przechowywania instancji stałych i zmiennych. Przechowywane właściwości stałych są definiowane słowem kluczowym „let”, a przechowywane właściwości zmiennych są definiowane słowem kluczowym „var”.

  • podczas definicji przechowywana właściwość 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 = 67print("\(n.digits)")print("\(n.pi)")

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

673.1415

rozważ następującą linijkę w powyższym kodzie−

let pi = 3.1415

tutaj zmienna pi jest inicjalizowana jako wartość przechowywanej właściwości z instancją pi = 3.1415. Tak więc, ilekroć instancja zostanie odwołana, będzie miała wartość 3.1415.

inną metodą przechowywania właściwości jest posiadanie stałych struktur. Tak więc cała instancja struktur będzie uważana za „przechowywane właściwości stałych”.

struct Number { var digits: Int let numbers = 3.1415}var n = Number(digits: 12345)n.digits = 67print("\(n.digits)")print("\(n.numbers)")n.numbers = 8.7

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−

error: cannot assign to 'numbers' in 'n'n.numbers = 8.7

zamiast reinicjalizować ’ liczbę 'do 8.7 zwróci komunikat o błędzie wskazujący, że’ liczba ’ jest zadeklarowana jako stała.

Lazy Stored Property

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 'lazy’jest używany przed deklaracją zmiennej, aby mieć ją jako właściwość przechowywaną jako lazy.

Lazy Properties are used−

  • aby opóźnić tworzenie obiektu.
  • 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)

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

Swift 4

zmienne instancji

w Objective C, Przechowywane właściwości mają również zmienne instancji do celów tworzenia kopii zapasowych do przechowywania wartości zadeklarowanych w przechowywanej właściwości.

Swift 4 integruje oba te pojęcia w jedną deklarację „przechowywanych właściwości”. Zamiast odpowiedniej zmiennej instancji i wartości kopii zapasowej „przechowywana właściwość” zawiera wszystkie zintegrowane informacje zdefiniowane w jednym miejscu o właściwości zmiennych według nazwy zmiennej, typu danych i funkcji zarządzania pamięcią.

właściwości obliczeniowe

zamiast przechowywania wartości właściwości obliczeniowe zapewniają getter i opcjonalny setter do pośredniego pobierania i ustawiania innych właściwości i wartości.

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)

uruchamiając powyższy program za pomocą playground otrzymujemy 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.

właściwości obliczeniowe jako właściwości tylko do odczytu

właściwość tylko do odczytu w właściwości obliczeniowej jest zdefiniowana jako właściwość z getterem, ale bez settera. Zawsze służy do zwrócenia wartości. Zmienne są dalej dostępne przez”.’Składnia, ale nie może być ustawiona na inną wartość.

class film { var head = "" var duration = 0.0 var metaInfo: { return }}var movie = film()movie.head = "Swift 4 Properties"movie.duration = 3.09print(movie.metaInfo!)print(movie.metaInfo!)

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik−

Swift 4 Properties3.09

obliczone właściwości jako obserwatorzy właściwości

w Swift 4 do obserwowania i odpowiadania na wartości właściwości używane są Obserwatory właściwości. Za każdym razem, gdy ustawione są wartości właściwości, wywoływane są obserwatory właściwości. Oprócz leniwych właściwości przechowywanych możemy dodać obserwatorów właściwości do właściwości ’ dziedziczone 'metodą’overridining’.

obserwatorów właściwości można zdefiniować przez

  • przed zapisaniem wartości-willset

  • po zapisaniu nowej wartości-didset

  • gdy właściwość jest ustawiona w inicjalizatorze, nie można wywoływać 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 = 100NewCounter.counter = 800

po uruchomieniu powyższego programu za pomocą playground otrzymujemy następujący wynik−

Total Counter is: 100Newly Added Counter 100Total Counter is: 800Newly Added Counter 700

zmienne lokalne i globalne

zmienne lokalne i globalne są deklarowane do obliczeń i obserwacji właściwości.

zmienne lokalne zmienne globalne
zmienne zdefiniowane w kontekście funkcji, metody lub 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żywane do pobierania i ustawiania wartości. przechowywane właściwości są używane do pobierania i ustawiania wartości.
stosowane są również właściwości obliczeniowe. stosowane są również właściwości obliczeniowe.

właściwości typu

właściwości są zdefiniowane w sekcji definicja typu z nawiasami klamrowymi {} i zakres zmiennych jest 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 }}

odpytywanie 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 tylko na typie 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 = 98print(stud1Mark1.InternalMarks)stud1Mark2.InternalMarks = 87print(stud1Mark2.InternalMarks)

uruchamiając powyższy program za pomocą playground otrzymujemy następujący wynik –