Назначение ключевого слова "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. Я просто использую его везде, где он должен возвращать объект текущего класса (подклассы возвращают объект этого подкласса), особенно в удобных методах и т.д.

Существует отличный ответ который может помочь.