2009-12-23 3 views
2

Я хочу создать метод, который может принимать объект NSMutableArray или NSArray.Метод, который принимает NSArray и NSMutableArray

Я думаю, что могу просто использовать (id) в качестве типа параметра ... или преобразовать NSArray в NSMutableArray перед прохождением. Однако я не очень доволен этими решениями.

В других языках я мог бы передать IList или какой-то общий объект, который они оба наследуют от ...

мне нужно перечислить через массив в моем методе.

Как люди обычно делают это в объективном c?

ответ

16

Принимать NSArray. NSMutableArray происходит от NSArray, так как вы используете только пользователей NSArray (например, только для чтения), вы будете в безопасности.

Соответствующая документация (с сайта разработчика от Apple):

+0

действительно, это то, что я бы сделал на самом деле –

+4

Это фактическая вещь, называемая принципом подписи Лискова - в любом месте, где вы можете использовать тип, вы должны иметь возможность использовать один из своих подтипов. Таким образом, любая функция, использующая NSObject (например, методы 'keep' и' release'), может принимать NSString, функция, использующая NSString, может принимать NSMutableString и т. Д. Фактически, NSArrays, который вы используете, - это * никогда * прямые экземпляры NSArray - они фактически являются экземплярами частного подкласса, и он «просто работает» из-за принципа подстановки. – Chuck

2

Использование NSArray* - NSMutableArray наследует от него, и вы можете перебирать и как если бы они были NSArray s.

5

С NSMutableArray является подклассом NSArray, просто введите свой метод NSArray. Таким образом, это займет все, что есть или является подклассом NSArray.

1

Я хотел бы использовать NSArray в качестве параметра, потому что я предпочитаю использовать неизменяемые объекты, где это возможно (ослабление связи), а затем использовать метод -mutableCopy, когда требуется отправить их функции, которая нуждается в изменении массива.

Смежные вопросы