Объявлен против фактического типа, в Задаче C - PullRequest
2 голосов
/ 24 ноября 2011

Я что-то отлаживал в своем коде и понял, что следующие компиляции

NSMutableSet *s = [[NSMutableArray alloc] init];

Card *c = [[Card alloc] init];

[s addObject:c];
[s addObject:c];
[s addObject:c];

NSLog(@"Set now contains %d cards ", [s count]); //Prints 3

Но объявленный тип - это Set здесь ... почему допускаются дубликаты?Почему это компилируется вообще?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

[[NSMutableArray alloc] init] возвращает тип id, стандартно для Objective-C возвращать тип id. Во многих случаях фактический возвращаемый тип зависит от реализации класса, многие предоставляемые Apple классы являются кластерами классов и возвращают другой тип. Типичным примером этого является NSString, который обычно возвращает экземпляр класса NSCFString.

Важно соблюдать осторожность при сопоставлении имен классов.

Также см. Ответ Марк Шарбонно здесь

2 голосов
/ 24 ноября 2011

[[NSMutableArray alloc] init] возвращает id как упомянуто @CocoaFu. Вы назначаете его указателю, который вы объявили как NSMutableSet, что является приемлемым из-за возвращенного id. Как и большинство других языков, просто потому, что вы объявили, что это NSMutableSet, это не делает его одним.

Так как NSMutableSet и NSMutableArray имеют метод с именем -addObject:, компилятор не предупреждает о вызове неизвестного метода.

В вашем коде нет конкретной ошибки, кроме того, что указатель, как объявлено, является неточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...