Использование instancetype в качестве возвращаемого типа копии в Objective-C?

Рекомендуется использовать instancetype в качестве возвращаемого значения init и связанных методов, см. последнюю функции clang. Однако, какова наилучшая практика w.r.t. возвращаемое значение copyWithZone: в протоколе NSCopying (см. эту ветку для предыдущих рекомендаций) ? Это не упоминается в правилах вывода класса из схемы именования методов в статье clang, но я не понимаю, почему оно должно отличаться от возвращаемого значения метода alloc.

Вывод типа не работает для copy-методов? Должны ли мы по-прежнему возвращать instancetype или, скорее, конкретный тип класса, который мы на самом деле возвращаем?


person user8472    schedule 10.10.2013    source источник


Ответы (2)


Вы НЕ должны использовать instancetype. Очевидный случай здесь заключается в том, что существует различие неизменяемый/изменяемый - copy из NSMutableString возвращает NSString, который вы должны рассматривать как неизменяемый. В этом случае API не возвращает экземпляр того же типа, что и получатель.

Другая причина заключается в том, что вы должны соответствовать подписи декларации, как заметил Джош Касвелл (+1).

Конечно, ничто не мешает вам объявить собственный протокол с желаемой семантикой и подписью.

person justin    schedule 10.10.2013

Вы не объявляете copyWithZone:; он уже объявлен протоколом, и если ваш класс говорит, что он соответствует протоколу, то он также принимает существующее объявление. Это объявление использует id в качестве возвращаемого типа.

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

Насколько я знаю, instancetype "совместим" с id*, так что вы можете написать это в своем определении, но, строго говоря, я думаю, что лучше использовать тот же тип, что и в объявлении.

Поэтому используйте id.


*То есть, Clang не жалуется на то, что copyWithZone: определяется с instancetype в качестве возвращаемого типа.

person jscs    schedule 10.10.2013