Kann ich einen @property-Wert in Objective-C mithilfe von @synthesized-Methoden validieren?

9

Was es verspricht: Ich möchte die @property / @synthesize -Syntax verwenden, um eine Eigenschaft für meine Objective-C 2.0-Klasse zu definieren, aber ich möchte den zulässigen Wertebereich einschränken die Eigenschaft. Zum Beispiel:

%Vor%

Implementierung:

%Vor%

Beachten Sie, dass die Syntax hier nur ein Beispiel ist. Ist das oder etwas Ähnliches möglich? Alternativ dazu, was ist das literale Äquivalent eines synthetisierten Setter, so dass ich sicherstellen kann, dass ich die gleichen Regeln für die Objektrückhaltung in meinen manuellen Settern verwende, wie es in einem synthetisierten verwendet wird.

    
Chris R 12.06.2009, 02:17
quelle

2 Antworten

8

Unter der Annahme, dass Ihre Eigenschaften Key-Value-konform sind (wie bei Verwendung von @synthesize), sollten Sie auch Key-Value-konforme Validatoren implementieren. Werfen Sie einen Blick auf die Dokumentation von Apple zu diesem Thema: Ссылка

Wichtig ist, dass die Validierung nicht automatisch erfolgt, außer wenn bestimmte Arten der Bindung verwendet werden. Entweder rufen Sie den Validator direkt oder indem Sie validateValue:forKey:error: aufrufen.

Sie könnten den produzierten Setter überschreiben, um den Validator vor dem Speichern aufzurufen, aber wenn Sie Bindings verwenden, ist dies wahrscheinlich nicht das, was Sie tun möchten, da der Validator möglicherweise mehrmals für eine einzelne Modifikation aufgerufen wird.

Beachten Sie auch, dass der Validierer möglicherweise den zu validierenden Wert ändert.

Also schauen wir uns Ihr Beispiel an (ungetestet, übrigens. Ich bin nicht in der Nähe eines Mac):

%Vor%

Wenn Sie den synthetisierten Setter überschreiben und die Validierung durchführen lassen wollten (noch ungetestet):

%Vor%

Sie können sehen, dass wir die ganze Zahl in eine NSNumber-Instanz umbrechen mussten, um dies zu tun.

    
toholio 12.06.2009, 02:47
quelle
3

Wenn Sie @synthesize verwenden, werden die Accessor-Methoden generiert. Sie können Ihre eigenen implementieren, die die generierte überschreiben wird.

Sie können Ihre eigene Implementierung in die Accessor-Methoden einfügen, z. Sie können vor der Zuweisung Wertprüfungen hinzufügen.

Sie können das eine oder das andere oder beides weglassen, diejenigen, die Sie nicht implementieren, werden wegen @synthesize generiert, wenn Sie @dynamic verwenden, geben Sie an, dass Sie Accessoren entweder zur Kompilier- oder zur Laufzeit bereitstellen werden / p>

Accessors haben Namen, die von den Eigenschaften name myproperty und setMyproperty abgeleitet sind. Die Methodensignaturen sind Standard, so dass es einfach ist, eigene zu implementieren. Die tatsächliche Implementierung hängt von der Eigenschaftsdefinition ab (kopieren, beibehalten, zuweisen) und ob sie schreibgeschützt ist oder nicht (schreibgeschützter Zugriff wird nicht festgelegt). Weitere Informationen finden Sie unter objective-c Referenz.

Apple-Referenz:

  

@synthesize Sie verwenden die @ synthesize   Schlüsselwort, um dem Compiler das mitzuteilen   sollte den Setter und / oder synthetisieren   Getter-Methoden für die Eigenschaft, wenn Sie   Liefern Sie sie nicht innerhalb der   @ Implementierungsblock.

%Vor%     
stefanB 12.06.2009 02:37
quelle

Tags und Links