В Objective-C почему id используется как тип возвращаемого значения для методов init? - PullRequest
29 голосов
/ 23 декабря 2011

Я сделал быстрый поиск и не смог найти ответ на этот вопрос.

Мне интересно узнать, почему в Objective-C id используется в качестве возвращаемого типа для методов init.

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

Ответы [ 4 ]

19 голосов
/ 23 декабря 2011

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

5 голосов
/ 07 мая 2013

Идея типа суперкласса, хотя и является хорошей теорией, на самом деле не оправдывает себя: A NSString * равно a NSObject *. Нет причин, по которым это нельзя назвать таковым.

Вместо этого я думаю, что это больше связано с сигнатурами функций. В динамическом языке, таком как Objective-C, вы не можете знать, с каким классом вы обмениваетесь сообщениями. Но компилятор должен знать, какой тип возвращается. Это и история Objective-C программирования на основе соглашений (а не наличие строгих правил) означает, что ваш подкласс может вернуть NSRect (a struct) или NSInteger (скаляр) из init. Это было странно, но верно.

C ++ имеет похожую проблему, см. Является ли тип возвращаемого значения частью сигнатуры функции? .

Таким образом, нам нужен был один тип для всех методов с сигнатурой -(id)init, и id было единственным, что имело смысл, поскольку указывало только, что возвращаемый тип является экземпляром. Этого достаточно для правильной работы компилятора. Теперь у нас есть instancetype, что соответствует сообщаемому классу.

3 голосов
/ 18 сентября 2013

Тем временем Apple добавила новый способ объявления типа возврата init методов.

Это instancetype. Подробнее об этом, например. здесь

2 голосов
/ 23 декабря 2011

возможно, что init фактически возвращает экземпляр другого класса, поэтому используется id. не могу сказать, что я когда-либо видел, чтобы это произошло на практике, но эй:)

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