2010-12-29 12 views
1

Ich habe eine Kategorie auf NSDate, und ich möchte einige Funktionen implementieren, das Datum zu manipulieren, wie:Objective-C: Ändern „Selbst“ Wert innerhalb Selbst

NSDate *thedate = [NSDate date]; 
[thedate setToMidnight]; 

so dass ich eine Funktion in NSDate haben wie :

-(void)setToMidnight { 
    some code with calendars and comps 

    self = theNewDate; 
} 

Dies funktioniert innerhalb der Funktion, aber außerhalb dieser Memberfunktion hat thedate nicht geändert. Ich verstehe diese Fehlfunktion, weil mir gesagt wurde, dass Selbst nur eine lokale Variable ist, die innerhalb der Elementfunktion erstellt wurde. Also, wie kann ich das schaffen?

Natürlich hätte ich geschrieben:

thedate = [thedate dateAsMidnightDate] 
or thedate = [NSDate dateAtMidnightFromDate:thedate] 

aber ich fühle es mehr Sinn, in der Instanz der Klasse hat, wie ich will nicht das Datum ändern, sondern nur einige Werte der zuvor erstellten anpassen ein.

Antwort

6

Sie können nicht. Speziell:

  1. Eine Funktion oder Methode kann lokale Variablen im aufrufenden Kontext nicht ändern.

  2. NSDate ist nicht änderbar (d. H., Sie können ein NSDate nicht mehr ändern, nachdem es erstellt wurde).

Daher kann keine solche Methode geschrieben werden. Der nächste, den Sie erhalten können, wäre eine Klasse, die ein NSDate umschließt und Nachrichten an dieses interne NSDate-Objekt weiterleitet, das die Datumsinstanzvariable neu zuweist, wenn Sie ein neues Datum darstellen wollen.

+0

Toll ... Ich werde darüber nachdenken, aber es scheint nur ein wenig zu kompliziert für dieses einfache Bedürfnis zu sein. Gibt es eine Möglichkeit, ein NSDate in einem MyNSDate zu kapseln und die Nachrichten, die nicht von MyNSDate implementiert werden, an das NSDate-Attribut zu routen? – Oliver

+1

@Oliver: Ja, tut mir leid, ich hätte es ein bisschen besser erklären sollen. Darauf bezieht sich "Weiterleitung von Nachrichten". Hier ist Apples Nachrichtenweiterleitung: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html – Chuck

+0

Großartig, großartig! Für jetzt habe ich gerade eine Kategorie auf NSDate gemacht, aber wenn ich etwas Zeit habe, werde ich das versuchen. Wenn Sie so vorgehen und die Methode forward message in meine Klasse implementieren, wissen Sie, ob der Compiler mich benachrichtigen wird (oder aufhört, mich zu benachrichtigen), wenn ich nicht unterstützte/weitergeleitete Nachrichten an meine Klasse sende? – Oliver

Verwandte Themen