#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
передаваемого вами объекта (), это должно работать нормально.