Wenn ich ein unveränderliches Array wie dieses + (NSArray *)ids
zurückgeben möchte, deklariere ich innerhalb dieser Methode ein NSMutableArray
, weil ich es mit -sortUsingSelector:
sortieren möchte.
Die Rückkehr dieser Methode funktioniert perfekt.
Aber ist es "okay", Code zu schreiben, der erklärt, dass die Rückgabemethode ein Typ und der tatsächliche Typ ein anderer Typ sein sollte?
Funktioniert das, weil NSMutableArray
eine Unterklasse von NSArray
ist?
Ist der tatsächliche Rückgabewert ein NSArray
oder ein NSMutableArray
?
(...) Ist es "okay", Code zu schreiben, der erklärt, dass die Rückgabemethode ein Typ und der tatsächliche Typ ein anderer Typ sein sollte?
Ja, vorausgesetzt, die Typen sind kompatibel. siehe nächsten Absatz. Tatsächlich gibt es auch einige Fälle in Cocoa (insbesondere Klassencluster), die das tun.
Funktioniert das, weil NSMutableArray eine Unterklasse von NSArray ist?
Genau. Da NSMutableArray
eine Unterklasse von NSArray
ist, erbt es alle seine Methoden und deklarierten Eigenschaften, so dass es sich wie NSArray
verhält. Dies wird als Liskov-Substitutionsprinzip bezeichnet.
Ist der tatsächliche Rückgabewert ein NSArray oder ein NSMutableArray?
Der Rückgabewert ist, was auch immer Sie zurückgeben. Da Sie NSMutableArray
zurückgeben, handelt es sich um NSMutableArray
. Aus Sicht des Aufrufers ist es ein Objekt, das wie ein NSArray
verwendet werden kann.
Ob es "okay" ist oder nicht, ist eine schwierige Frage. Wenn es ein kleines Projekt ist und nur Sie den Code verwenden, könnte es in Ordnung sein. Wenn Sie sich jedoch darauf verlassen, dass nichts das zurückgegebene " NSArray
" ändern kann, ist es nicht in Ordnung. (Siehe den letzten Punkt)
Ja.
NSMutableArray
. Mit einer einfachen Besetzung können Sie die darin enthaltenen Werte ändern. Wenn Sie ein unveränderliches Objekt tatsächlich zurückgeben möchten, gehen Sie folgendermaßen vor:
%Vor%Tags und Links objective-c cocoa nsarray nsmutablearray return-type