Используйте (id)
в качестве типа возвращаемого значения.
Objective-C не поддерживает ковариантные объявления. Рассмотрим:
@interface NSArray:NSObject
+ (id) array;
@end
Теперь вы можете звонить +array
на NSArray
и NSMutableArray
. Первый возвращает неизменный массив, а второй - изменяемый массив. Из-за отсутствия поддержки в Objective-C ковариантного объявления, если бы вышеупомянутое было объявлено как возвращающее (NSArray*)
, клиенты метода подклассов должны были бы привести к `(NSMutableArray *). Гадкий, хрупкий и подверженный ошибкам. Таким образом, использование универсального типа, как правило, является наиболее простым решением.
Итак ... если вы объявляете метод, который возвращает экземпляр определенного класса, типизируйте явно. Если вы объявляете метод, который будет переопределен, и это переопределение может вернуть подкласс и тот факт, что он возвращает подкласс, будет выставлено клиентам, тогда используйте (id)
.
Назначенные инициализаторы работают так же. Метод -init*
может возвращать экземпляр практически любого типа, в зависимости от контекста реализации (конечно). Таким образом, возвращаемый тип методов инициализации является ковариантным, и в результате вам необходимо использовать (id)
в качестве возвращаемого типа.
Не нужно регистрировать ошибку - их уже несколько.
<Ч />
Обратите внимание, что теперь в LLVM есть ключевое слово instancetype
, которое можно использовать вместо id
в объявлении, подобном приведенному выше. Это означает, что «этот метод возвращает экземпляр, который успешно проходит isKindOfClass:
тест класса, для которого он был вызван».