Могу ли я иметь протокол в качестве переменной класса в Objective-C? - PullRequest
2 голосов
/ 28 июня 2011

Я новичок в Objective C. Я пытаюсь использовать протокол так же, как интерфейс в Java, но я не знаю, как или даже если это правильный инструмент для работы.Я определил протокол в Protocol.h:

@protocol SomeProtocol
- (void)someMethod;
@end

Теперь в другом классе мне нужна переменная, которая имеет someMethod

#import "Protocol.h"
@interface OtherClass:NSObject {
    SomeProtocol objWithSomeMethod;
}
@end

Конечно, "SomeProtocol objWithSomeMethod" дает мнеошибка.Так есть ли способ объявить объект, который, независимо от типа, соответствует этому протоколу?

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Угловые скобки определяют объекты как реализующие протоколы. В вашем примере напишите

#import "Protocol.h"
@interface OtherClass : NSObject {
    id<SomeProtocol> objWithSomeMethod;
}
@end

Если вы хотите объявить, что класс реализует интерфейс, вы используете ту же запись, по существу:

@interface MyProtocolClass : NSObject <SomeProtocol> {
    // ...
}
@end
4 голосов
/ 28 июня 2011

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

id<SomeProtocol> objWithSomeMethod;

Если вы хотите, чтобы она соответствовала нескольким протоколам, вы можете использовать запятые для их разделения следующим образом:

id<SomeProtocol, SomeOtherProtocol> objWithSomeMethod;

Вы также можете объявить переменные или параметры таким же образом.

0 голосов
/ 28 июня 2011

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

#import "Protocol.h"
@interface OtherClass:NSObject {
    id <SomeProtocol> objWithSomeMethod;
}
@end
...