Назначение ключевого слова "instancetype" в методах "objectWith"?
Последние компиляторы Objective-C представляют ключевое слово "instancetype", которое, среди прочего, может использоваться для предоставления типизированных коллекций.,
Я видел другую цель instancetype, которая использовала его в методах типа objectWith на классах. Например:
@interface Car
+(instancetype)carWithWheels:(NSArray*)wheels;
@end
Обоснование заключалось в том, что компилятор будет выполнять проверку типов для методов initWith, но не для методов 'objectWith'.
Кроме того, чтобы быть более легким в использовании, в чем преимущество использования "instancetype" вместо фактического имени класса? Например:
@interface Car
+(Car*)carWithWheels:(NSArray*)wheels;
@end
Ответы
Ответ 1
Используя instancetype
, вы говорите, что подклассы возвращают объект подкласса.
Если мы имеем
@interface Car
+(instancetype)carWithWheels1:(NSArray *)wheels;
+(Car *)carWithWheels2:(NSArray *)wheels;
@end
и
@interface VolkswagenBeetle : Car
@end
то +[VolkswagenBeetle carWithWheels1:]
гарантированно вернет экземпляр VolkswagenBeetle
; но +[VolkswagenBeetle carWithWheels2:]
может вернуть Buick
, a Caddilac
или ChittyChittyBangBang
.
Ответ 2
Вы можете подклассифицировать Car
и по-прежнему использовать instancetype. Конечно, вы можете достичь этого с помощью id, но вы потеряете проверку типа, которую вы получите из instancetype.
Я просто использую его везде, где он должен возвращать объект текущего класса (подклассы возвращают объект этого подкласса), особенно в удобных методах и т.д.
Существует отличный ответ который может помочь.