Objective-c gibt die Methode zurück, die NSMutableArray anstelle des deklarierten NSArray-Rückgabetyps zurückgibt

8

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 ?

Peter Warbo 06.07.2011, 10:12
quelle

2 Antworten

6
  

(...) 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.

    
user557219 06.07.2011, 10:16
quelle
2
  • 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.

  • Es ist ein 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%     
uvesten 06.07.2011 10:18
quelle