Может ли объект класса ObjC соответствовать протоколу?
Есть ли способ указать компилятору, что объект класса соответствует протоколу?
Как я понимаю, создавая методы класса +(void)foo
, экземпляр этого объекта класса будет иметь эти методы как методы экземпляра. Поэтому, пока я создаю методы +(void)foo
для всех необходимых методов протокола, я могу иметь объект класса как делегат.
Моя проблема, конечно, в том, что в заголовочном файле класса я знаю, как указывать, что экземпляры класса соответствуют протоколу (как это обычно бывает). Итак, лучшее, что я понял, - это бросить объект класса следующим образом:
something.delegate = (id<SomethingDelegate>)[self class]
Любые идеи?
Связанные, но разные:
ObjC: есть ли такая вещь, как "протокол класса" ??
Ответы
Ответ 1
То, что вы делаете сейчас, является правильным, так как это замалчивает предупреждения, которые являются вашей целью. Вы будете отправлять сообщения объекта класса, определенные в протоколе, для экземпляров, которые немного запутывают, но время выполнения не заботится.
Подумайте об этом так: вы хотите установить делегат для объекта, который отвечает на сообщения, определенные в протоколе. Ваш класс делает это, и ваш класс также является объектом. Поэтому вы должны относиться к своему классу как к объекту, который соответствует этому протоколу. Поэтому то, что вы написали, абсолютно правильно (на основе того, что вы пытаетесь сделать).
Однако стоит отметить, что этот класс не будет правильно отвечать на conformsToProtocol:
. Обычно это нормально для настройки делегата (делегаты обычно не проверяют, соответствует ли класс — они просто проверяют, может ли он отвечать на селектор).
В качестве побочной заметки вы можете синтаксически сделать следующее:
Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];
Различие заключается в том, что компилятор будет использовать методы класса из протокола вместо сообщений экземпляра. Однако это не то, что вы хотите в своем случае.
Ответ 2
Нет синтаксиса Objective-C, чтобы указать, что метакласс соответствует протоколу.
Я думаю, вы можете сделать это во время выполнения, используя class_addProtocol
в метаклассе. Но я не пробовал.
Я думаю, вы могли бы также написать метод +conformsToProtocol:
в своем классе и нести свое соответствие. Это может иметь неожиданные побочные эффекты, поскольку уже существует +conformsToProtocol:
на NSObject
(в дополнение к -conformsToProtocol:
).
Ни один из них не устранит необходимость броска, чтобы закрыть компилятор. Просто используйте синглтон.