Метод возврата Objective-C, возвращающий NSMutableArray вместо объявленного типа возврата NSArray - PullRequest
8 голосов
/ 06 июля 2011

Если я хочу вернуть неизменный массив, подобный этому + (NSArray *)ids, но внутри этого метода я объявляю NSMutableArray, потому что я хочу отсортировать его, используя -sortUsingSelector:.

Возврат этого метода работает отлично.

  • Но нормально ли это писать код, который объявляет, что метод возврата должен быть одного типа, а фактический тип - другим?

  • Работает ли это, потому что NSMutableArray является подклассом NSArray?

  • Является ли фактическое возвращаемое значение NSArray илиNSMutableArray?

Ответы [ 2 ]

6 голосов
/ 06 июля 2011

(…) нормально ли писать код, который объявляет, что возвращаемый метод должен быть одного типа, а фактический тип - другим?

Да, предоставляется типсовместимы;см. следующий абзацФактически, есть некоторые случаи в Какао (особенно кластеры классов), которые также делают это.

Это работает, потому что NSMutableArray является подклассом NSArray?

Точно,Поскольку NSMutableArray является подклассом NSArray, он наследует все свои методы и объявленные свойства, поэтому он публично ведет себя как NSArray.Это называется принцип подстановки Лискова .

Является ли фактическое возвращаемое значение NSArray или NSMutableArray?

Возвращаемое значение - то, что вы 'возвращаюсь.Так как вы возвращаете NSMutableArray, это NSMutableArray.С точки зрения вызывающего, это объект, который можно использовать как NSArray.

2 голосов
/ 06 июля 2011
  • Является ли это "хорошо" или нет, это сложный вопрос.Если это небольшой проект, и только вы используете код, это может быть хорошо.Однако, если вы не полагаетесь на то, что ничего не сможете изменить возвращенное «NSArray», это не нормально.(См. Последний пункт)

  • Да.

  • Это NSMutableArray.Простое приведение позволит вам изменить значения в нем.

Если вы действительно хотите вернуть неизменный объект, выполните следующие действия:

  NSArray* immutableArray = [[mutableArray copy] autorelease];
  return immutableArray;
...