Swift – Properties

Anzeigen

Swift 4 language bietet Eigenschaften für Klasse, Aufzählung oder Struktur, um Werte zuzuordnen. Eigenschaften können weiter in gespeicherte Eigenschaften und berechnete Eigenschaften klassifiziert werden.

Unterschied zwischen gespeicherten und berechneten Eigenschaften

Gespeicherte Eigenschaft Berechnete Eigenschaft
Speichern Sie konstante und variable Werte als Instanz Berechnen Sie einen Wert, anstatt den Wert zu speichern
Bereitgestellt durch Klassen und Strukturen Bereitgestellt durch Klassen, Aufzählungen und Strukturen

Sowohl gespeicherte als auch berechnete Eigenschaften sind dem Instanztyp zugeordnet. Wenn die Eigenschaften mit ihren Typwerten verknüpft sind, wird sie als ‚Typeigenschaften‘ definiert. Gespeicherte und berechnete Eigenschaften sind normalerweise Instanzen eines bestimmten Typs zugeordnet. Eigenschaften können jedoch auch dem Typ selbst zugeordnet werden. Solche Eigenschaften werden als Typeigenschaften bezeichnet. Eigenschaftsbeobachter werden auch verwendet

  • Um den Wert der gespeicherten Eigenschaften zu beobachten
  • Um die Eigenschaft einer von der Oberklasse abgeleiteten Unterklasse zu beobachten

Gespeicherte Eigenschaften

Swift 4 führt ein Konzept für gespeicherte Eigenschaften zum Speichern der Instanzen von Konstanten und Variablen ein. Gespeicherte Eigenschaften von Konstanten werden durch das Schlüsselwort ‚let‘ und gespeicherte Eigenschaften von Variablen durch das Schlüsselwort ‚var‘ definiert.

  • Während der Definition Gespeicherte Eigenschaft liefert ‚Standardwert‘
  • Während der Initialisierung kann der Benutzer die Anfangswerte initialisieren und ändern
struct Number { var digits: Int let pi = 3.1415}var n = Number(digits: 12345)n.digits = 67print("\(n.digits)")print("\(n.pi)")

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

673.1415

Betrachten Sie die folgende Zeile im obigen Code −

let pi = 3.1415

Hier wird die Variable pi als gespeicherter Eigenschaftswert mit der Instanz pi = 3.1415 initialisiert. Wenn also auf die Instanz verwiesen wird, enthält sie nur den Wert 3.1415.

Eine andere Methode, um gespeicherte Eigenschaften zu haben, besteht darin, als konstante Strukturen zu haben. Daher wird die gesamte Instanz der Strukturen als ‚gespeicherte Eigenschaften von Konstanten‘ betrachtet.

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

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

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

Anstatt die ‚Nummer‘ auf 8.7 neu zu initialisieren, wird eine Fehlermeldung zurückgegeben, die angibt, dass die ‚Nummer‘ als konstant deklariert ist.

Lazy Stored Property

Swift 4 bietet eine flexible Eigenschaft namens ‚Lazy Stored Property‘, bei der die Anfangswerte nicht berechnet werden, wenn die Variable zum ersten Mal initialisiert wird. Der Modifikator ‚lazy‘ wird vor der Variablendeklaration verwendet, um ihn als lazy gespeicherte Eigenschaft zu haben.

Lazy-Eigenschaften werden verwendet −

  • Um die Objekterstellung zu verzögern.
  • Wenn die Eigenschaft von anderen Teilen einer Klasse abhängig ist, die noch nicht bekannt sind
class sample { lazy var no = number() // `var` declaration is required.}class number { var name = "Swift 4"}var firstsample = sample()print(firstsample.no.name)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

Swift 4

Instanzvariablen

In Objective C haben gespeicherte Eigenschaften auch Instanzvariablen für Sicherungszwecke, um die in der gespeicherten Eigenschaft deklarierten Werte zu speichern.

Swift 4 integriert diese beiden Konzepte in eine einzige ’stored Property‘ -Deklaration. Anstatt eine entsprechende Instanzvariable und einen Sicherungswert zu haben, enthält ’stored property‘ alle integrierten Informationen, die an einem einzigen Ort über die Variableneigenschaft durch Variablennamen, Datentyp und Speicherverwaltungsfunktionen definiert sind.

Berechnete Eigenschaften

Anstatt die Werte zu speichern, bieten berechnete Eigenschaften einen Getter und einen optionalen Setter, um andere Eigenschaften und Werte indirekt abzurufen und festzulegen.

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)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

(150.0, 75.0)-150.0-65.0

Wenn eine berechnete Eigenschaft den neuen Wert als undefiniert zurücklässt, wird der Standardwert für diese bestimmte Variable festgelegt.

Berechnete Eigenschaften als schreibgeschützte Eigenschaften

Eine schreibgeschützte Eigenschaft in der berechneten Eigenschaft ist als Eigenschaft mit Getter, aber ohne Setter definiert. Es wird immer verwendet, um einen Wert zurückzugeben. Auf die Variablen wird weiter über a ‚ zugegriffen.‘ Syntax, kann aber nicht auf einen anderen Wert gesetzt werden.

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!)

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

Swift 4 Properties3.09

Berechnete Eigenschaften als Eigenschaftsbeobachter

In Swift 4 werden Eigenschaftsbeobachter verwendet, um Eigenschaftswerte zu beobachten und darauf zu reagieren. Jedes Mal, wenn Eigenschaftswerte festgelegt werden, werden Eigenschaftsbeobachter aufgerufen. Mit Ausnahme von lazy stored properties können wir property observers zu ‚inherited‘ property by method ‚overriding‘ hinzufügen.

Eigenschaftsbeobachter können definiert werden durch

  • Vor dem Speichern des Wertes – willset

  • Nach dem Speichern des neuen Werts – didset

  • Wenn eine Eigenschaft in einem Initialisierer festgelegt wird, können willset- und Didset-Beobachter nicht aufgerufen werden.

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

Wenn wir das obige Programm mit playground ausführen, erhalten wir folgendes Ergebnis −

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

Lokale und globale Variablen

Lokale und globale Variablen werden zum Berechnen und Beobachten der Eigenschaften deklariert.

Lokale Variablen Globale Variablen
Variablen, die in einem Funktions-, Methoden- oder Abschlusskontext definiert sind. Variablen, die außerhalb des Funktions-, Methoden-, Abschluss- oder Typkontexts definiert sind.
Wird zum Speichern und Abrufen von Werten verwendet. Wird zum Speichern und Abrufen von Werten verwendet.
Gespeicherte Eigenschaften werden verwendet, um die Werte abzurufen und festzulegen. Stored properties wird verwendet, um die Werte abzurufen und festzulegen.
Berechnete Eigenschaften werden ebenfalls verwendet. Berechnete Eigenschaften werden ebenfalls verwendet.

Typeigenschaften

Eigenschaften werden im Abschnitt Typdefinition mit geschweiften Klammern {} definiert, und der Umfang der Variablen wird ebenfalls zuvor definiert. Zum Definieren von Typeigenschaften für Werttypen wird das Schlüsselwort ’static‘ und für Klassentypen das Schlüsselwort ‚class‘ verwendet.

Syntax

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 }}

Eigenschaften abfragen und setzen

Genau wie Instanzeigenschaften werden Typeigenschaften abgefragt und mit ‚ gesetzt. Syntax nur auf den Typ allein, anstatt auf die Instanz zu zeigen.

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)

Wenn wir das obige Programm mit playground ausführen, erhalten wir das folgende Ergebnis −