Как объявить класс, соответствующий протоколу, в качестве типа параметра?

#objective-c #class

#objective-c #класс

Вопрос:

Есть ли способ указать в качестве параметра класс, соответствующий определенному протоколу?

Сначала я попробовал, с небольшой надеждой, это:

 -(NSString *) getKeyForMyProtocolClass(Class<MyProtocol>)aClass
 

Но это вызывает

 [aClass superclass];
 

чтобы выдать предупреждение «Найден метод экземпляра ‘суперкласс’ вместо метода класса’суперкласс'». Я получаю такое же предупреждение для conformsToProtocol :.

Поскольку он не выдает таких предупреждений, когда параметр является (Class)AClass , кажется, что Class< MyProtocol> на самом деле не относится к типу Class .

Я не должен отправлять NSObject< MyProtocol> , поскольку мне нужно определить правильный ключ в соответствии с классом, а также его суперклассами, и создавать и добавлять новый объект только в том случае, если для этого ключа еще ничего не установлено.

Я мог бы проверить с помощью conformsToProtocol, но тогда мне пришлось бы возвращать нулевое значение, что просто запутанно. Я бы предпочел остановить проблему во время компиляции.

Короче говоря, существует ли объявление типа для класса, соответствующего протоколу?

Комментарии:

1. У меня есть класс, который может получать расширения, которые изменяют его поведение. Он хранит свои расширения в словаре, ключ зависит от класса. Он не знает, какие классы могут его расширять. Ключ — это самый верхний суперкласс, который реализует протокол, так что класс и его суперкласс не будут делать одно и то же, также поэтому другие классы могут спросить, имеет ли он определенное расширение, не зная всех подклассов класса этого расширения. У меня все на месте, за исключением сигнатуры метода, которая теперь заставляет меня возвращать nil, если данный класс не реализует протокол.

2. Обратите внимание: я давно не использовал Objective-C. Я больше не ищу ответа на этот вопрос и не чувствую себя вправе судить и принимать какие-либо ответы. Я думаю, что на данный момент этот вопрос принадлежит голосам сообщества.

Ответ №1:

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

 - (void)tempMethod:(Class<NSObject>)klass {
   id a = [(Class)klass superclass];
    NSLog(@"%@", a);
}
 

Поскольку вы знаете тип Class object передаваемого вами объекта (), это должно работать нормально.