Подтвердить что ты не робот

Может ли объект класса ObjC соответствовать протоколу?

Есть ли способ указать компилятору, что объект класса соответствует протоколу?

Как я понимаю, создавая методы класса +(void)foo, экземпляр этого объекта класса будет иметь эти методы как методы экземпляра. Поэтому, пока я создаю методы +(void)foo для всех необходимых методов протокола, я могу иметь объект класса как делегат.

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

something.delegate = (id<SomethingDelegate>)[self class]

Любые идеи?

Связанные, но разные: ObjC: есть ли такая вещь, как "протокол класса" ??

4b9b3361

Ответ 1

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

Подумайте об этом так: вы хотите установить делегат для объекта, который отвечает на сообщения, определенные в протоколе. Ваш класс делает это, и ваш класс также является объектом. Поэтому вы должны относиться к своему классу как к объекту, который соответствует этому протоколу. Поэтому то, что вы написали, абсолютно правильно (на основе того, что вы пытаетесь сделать).

Однако стоит отметить, что этот класс не будет правильно отвечать на conformsToProtocol:. Обычно это нормально для настройки делегата (делегаты обычно не проверяют, соответствует ли класс — они просто проверяют, может ли он отвечать на селектор).

В качестве побочной заметки вы можете синтаксически сделать следующее:

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

Различие заключается в том, что компилятор будет использовать методы класса из протокола вместо сообщений экземпляра. Однако это не то, что вы хотите в своем случае.

Ответ 2

Нет синтаксиса Objective-C, чтобы указать, что метакласс соответствует протоколу.

Я думаю, вы можете сделать это во время выполнения, используя class_addProtocol в метаклассе. Но я не пробовал.

Я думаю, вы могли бы также написать метод +conformsToProtocol: в своем классе и нести свое соответствие. Это может иметь неожиданные побочные эффекты, поскольку уже существует +conformsToProtocol: на NSObject (в дополнение к -conformsToProtocol:).

Ни один из них не устранит необходимость броска, чтобы закрыть компилятор. Просто используйте синглтон.