Ich lerne die Swift Programmiersprache und komme dabei manchmal mit der alten Objective-C Programmiersprache und deren Code in Kontakt.Objective-C: Überschreiben von Getter & Setter mit Instanzvariable (mit _)
Ich bin ein absoluter Anfänger und daher habe ich einige Fragen zum besseren Verständnis der Setter und Getter.
So weiß ich, dass ich eine Instanzvariable durch geschweifte Klammern in der .h-Datei erstellen kann, aber normalerweise verwende ich Eigenschaften. Diese Eigenschaften werden von einer Instanzvariable unterstützt und bieten automatisch eine Getter- und Setter-Methode an.
Beispiel:
Fahrzeug .h-Datei:
@interface Vehicle : NSObject
@property int myProperty;
@end
Weil ich diese Eigenschaft erstellt Ich muss keinen Getter und Setter-Methode in der vehicle.m Datei deklarieren, weil sie automatisch vom Compiler erstellt. So kann ich ein Fahrzeug-Objekt erstellen, setzen und den Wert bekommen.
Beispiel
main.m
Vehicle *myvehicle = [[vehicle alloc] init];
[myvehicle myProperty] // myvehicle.myProperty
[myvehicle setMyProperty : 10] // myvehicle.myProperty = 10;
Nun las ich, dass es möglich ist, die automatisch erstellt Getter und Setter-Methode meines erstellten Eigenschaft "myProperty" außer Kraft zu setzen. Wenn ich meine eigene Version von Getter und Setter deklariere, muss ich zwei Methoden in der Datei vehicle.h und vehicle.m deklarieren. In der Datei vehicle.m rufe ich das Objekt nicht auf, indem ich das self-Schlüsselwort verwende, sondern indem ich seine automatisch erzeugte Instanzvariable (_myProperty) verwende. Ist es richtig?
Ich habe es versucht, aber immer einen Fehler bekommen und ich weiß nicht warum und was ist der Punkt.
Beispiel
Fahrzeug .h-Datei:
@interface Vehicle : NSObject
@property int myProperty;
-(int) myProperty; //my new Getter method
-(void) setMyProperty: (int)updatedMyProperty; //My new Setter method
@end
Fahrzeug .m-Datei:
@implementation Vehicle
-(int) myProperty {
if (! _myProperty) {
_myProperty = NO;
}
return _myProperty;
}
-(void) setMyProperty: (int)updatedMyProperty {
if (_myProperty == updatedMyProperty) return;
_myProperty = updatedMyProperty;
}
@end
erhalte ich immer die Fehlermeldung "Die Verwendung von nicht deklarierter Bezeichner" und I don‘ Ich weiß warum. Wenn ich richtig verstanden habe, muss ich den ivar oder seinen Namen nicht mit @synthesize deklarieren, weil der Compiler automatisch den Ivar namens _myProperty für mich erstellt. Ich muss nur @synthesize verwenden, wenn ich den Namen des Ivars ändern möchte.
Ich bin nicht sicher, warum ich stecken bleiben und was der Punkt ist. Kannst du es erklären? Vielen Dank im Voraus!
Unrelated, aber vor Sie haben '[Meinfahrzeug setMyProperty = 10] '. Das sollte klar sein "myvehicle setMyProperty: 10]". – Rob