Frage Swift, was ist "bekommen" und "setzen"?


Ich lerne Swift und lese gerade The Swift Programming Language von Apple habe ich keinen Objective-C-Hintergrund (nur PHP, JS und andere, aber kein Obj C)

Auf Seite 24-25 sehe ich diesen Code:

//...Class definition stuff...

var perimeter: Double {
    get {
        return 3.0 * sideLength
    }
    set {
        sideLength = newValue / 3.0
    }
}

//...Class continues...

Dieser Teil ist nicht in dem Buch angegeben und ich kann nicht bekommen, wofür diese sind.

Kann mir jemand erklären was das ist bekommen und einstellen sind?


76
2017-07-11 13:48


Ursprung


Antworten:


Das wird kurz vor dem Code erklärt:

Zusätzlich zu einfachen Eigenschaften, die gespeichert werden, können Eigenschaften einen Getter und einen Setter haben.

class EquilateralTriangle: NamedShape {
    ...

Wenn eine andere Klasse diese Perimetervariable abrufen möchte, tun sie dies:

let someVar = myTriangle.perimeter

... Was das nennt:

get{
    return 3.0 * self.sideLength
}

Und so ist es im Wesentlichen, wenn der rufende Controller das getan hat:

let someVar = 3.0 * myTriangle.sideLength

Wenn du einstellen Die Variable von einem anderen Objekt sieht so aus:

myTriangle.perimeter = 100

Womit der Code in der aufgerufen wird set{} Block:

set {
    sideLength = newValue / 3.0
}

Und so ist es, als ob die Klasse, die die Variable setzt, dies getan hat:

myTriangle.sideLength = 100/3.0

Es ist nur aus Bequemlichkeit - Sie können dies von anderem Code aus aufrufen, ohne die ganze Zeit durch zu teilen oder mit 3 zu multiplizieren, denn das geschieht direkt vor dem Setzen der Variablen und direkt vor der Variablen.

In Swift können wir Eigenschaften haben, die beim Abrufen berechnet werden und beim Festlegen etwas bewirken können. Wir könnten das auch in Objective-C tun:

// .h
@property (nonatomic) double perimeter;

//.m

- (double)perimeter
{
    return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
    self.perimeter = perimeter; // In Swift, this is done automatically.
    self.sideLength = perimeter / 3.0;
}

21
2017-07-11 13:55



Das Abrufen und Setzen von Variablen in Klassen bezieht sich entweder auf das Abrufen ("Abrufen") oder Ändern ("Setzen") ihrer Inhalte.

Betrachten Sie eine Variable members einer Klasse family. Natürlich müsste diese Variable eine Ganzzahl sein, da eine Familie niemals aus zwei Personen bestehen kann.

Du würdest wahrscheinlich vorausgehen, indem du die members Variable wie folgt:

class family {
   var members:Int
}

Dies gibt jedoch Leuten, die diese Klasse benutzen, die Möglichkeit, die Anzahl der Familienmitglieder auf etwa 0 oder 1 zu setzen. Und da es so etwas wie eine Familie von 1 oder 0 nicht gibt, ist das ziemlich unglücklich.

Hier kommen die Getter und Setter ins Spiel. Auf diese Weise können Sie selbst entscheiden, wie Variablen geändert werden können und welche Werte sie erhalten können, und darüber entscheiden, welche Inhalte sie zurückgeben.

Zurück zu unserem Familienunterricht, lass uns sicherstellen, dass niemand den members Wert auf etwas weniger als 2:

class family {
  var _members:Int = 2
  var members:Int {
   get {
     return _members
   }
   set (newVal) {
     if newVal >= 2 {
       _members = newVal
     } else {
       println('error: cannot have family with less than 2 members')
     }
   }
  }
}

Jetzt können wir auf die zugreifen members Variable wie zuvor, durch Eingabe instanceOfFamily.membersund dank der Setter-Funktion können wir auch den Wert wie zuvor einstellen, indem wir zum Beispiel eingeben: instanceOfFamily.members = 3. Was sich jedoch geändert hat, ist die Tatsache, dass wir diese Variable nicht mehr auf etwas kleiner als 2 setzen können.

Beachten Sie die Einführung des _members Variable, die die aktuelle Variable zum Speichern des Wertes ist, den wir über members Setter-Funktion. Das Original members ist nun eine berechnete Eigenschaft, was bedeutet, dass sie nur als Schnittstelle dient, um mit unserer tatsächlichen Variablen umzugehen.


95
2017-07-11 14:13



Einer einfachen Frage sollte eine kurze, einfache und klare Antwort folgen.

  • Wenn wir einen Wert der Immobilie bekommen, feuert es get{}Teil.

  • Wenn wir der Eigenschaft einen Wert zuweisen, wird sie ausgelöst set{}Teil.

PS. Wenn Sie einen Wert für die Eigenschaft festlegen, erstellt SWIFT automatisch eine Konstante namens "newValue" = einen Wert, den wir festlegen. Nach einem konstanten "newValue" wird in der Eigenschaft zugegriffen set{}Teil.

Beispiel:

var A:Int = 0
var B:Int = 0

var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
     B = newValue
     }
}

//When we are getting a value of C it fires get{} part of C property
A = C 
A            //Now A = 1

//When we are setting a value to C it fires set{} part of C property
C = 2
B            //Now B = 2

15
2017-11-16 02:15



Sie sollten sich ansehen Berechnete Eigenschaften

In Ihrem Codebeispiel perimeter ist eine Eigenschaft, die nicht durch eine Klassenvariable gesichert wird, stattdessen wird ihr Wert mithilfe von get Methode und gespeichert über die set Methode - in der Regel als bezeichnet Getter und Setter.

Wenn Sie diese Eigenschaft wie folgt verwenden:

var cp = myClass.perimeter

Sie rufen den in der get Codeblock, und wenn Sie es so verwenden:

myClass.perimeter = 5.0

Sie rufen den in der set Codeblock, wo newValue wird automatisch mit dem rechts vom Zuweisungsoperator angegebenen Wert gefüllt.

Berechnete Eigenschaften können readwrite sein, wenn sowohl ein Getter als auch ein Setter angegeben sind, oder readonly, wenn nur der Getter angegeben ist.


1
2017-07-11 14:01