Какой тип должен выделять вернуть? - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть такой метод, который выполняет дальнейшую инициализацию других объектов с аналогичными методами init.

- (Foo*)initWithInput:(NSMutableString*)i {
  bar = [[Bar alloc] initWithInput:input];
  return self;
}

Это выдает предупреждение "Foo.m: 19: предупреждение: несовместимые типы Objective C, назначающие" struct Foo * ", ожидаемый" struct Bar * '"

Я предполагаю, что метод alloc возвращает тип (id), а затем компилятор не может решить, какой initWithInput: метод, который я хочу использовать для выделенного объекта. Конечно, я могу удалить предупреждение, но это не очень красиво

- (Foo*)initWithInput:(NSMutableString*)i {
  bar = [((Bar*)[Bar alloc]) initWithInput:input];
  return self;
}

Есть ли идиоматический способ справиться с этим?

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

Существует ли идиоматический способ справиться с этим?

Objective-C имеет плоское пространство имен для селекторов и не поддерживает ковариантную диспетчеризацию (в стиле Java и C ++).Таким образом, вам необходимо уникально называть ваши методы для каждой аргументации.

Это также стандартный шаблон фреймворков.Вы [обычно - есть 1 или 2 исключения) не видите двух методов с одинаковым именем - одним и тем же селектором - с разной аргументацией.Когда это произойдет - например, возвращаемое значение alloc - вы увидите id used.

1 голос
/ 10 сентября 2010

Все init -методы должны возвращать id, а не тип класса, к которому они принадлежат, именно по этой причине.Это фактически задокументировано Apple где-то.Пока я не могу найти ссылку.

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