嗨,我有一个协议的问题
#import <Foundation/Foundation.h>
@protocol StandardQuality <NSObject>
- (NSString *)color;
- (NSString *)fabric;
-( NSString *)store;
- ( NSString *)price;
@end
我在类
中实现此协议 @interface Hat : NSObject <StandardQuality>
@property NSString *color;
@property NSString *fabric;
@property NSString *store;
@end
这是我所期望的。我收到了一条警告信息
协议未实现的方法“价格”。
无论如何。我在main.h中测试了
[myHat setShop:@"Unirea"];
NSLog(@" The hat is selling at %@", myHat.store);
if([myHat conformsToProtocol:@protocol(StandardQuality)]== YES)
{
NSLog(@"My hat respects the protocol");
}
else {
NSLog(@"My hat doesn't respect the protocol");
}
if([myHat respondsToSelector:@selector(price)]== YES)
{
NSLog(@"My hat has price");
}
else {
NSLog(@"My hat doesn't have price");
}
奇怪的是,我收到了
我的帽子尊重协议
我的帽子没有价格
我的第二个问题是:如果不遵守协议,这是阻止编译器编译程序的方法,而不仅仅是接收警告消息?
答案 0 :(得分:2)
奇怪的是,我收到了
我的帽子尊重协议
我的帽子没有价格
有什么奇怪的?你完全得到了你所做的。您的类符合协议,但未实现price
方法。
如果不遵守协议,这是阻止编译器编译程序的方法,而不仅仅是接收警告消息?
我想你想问一下是否有办法。好吧,你可以打开-Werr
编译器开关,如果遇到警告就会使编译器挽救,然后可能只关闭协议中未实现的方法的警告(谷歌搜索相应的编译器标志)。
答案 1 :(得分:2)
您可以通过将-Werror=incomplete-implementation
添加到Xcode项目“Build Settings”的“Language”部分中的“Other C Flags”,将不完整协议的警告转换为错误(或者您可以传递该选项)如果从命令行调用,则为编译器。)
如果您想在运行时检查某个类是否实际实现了协议,而不是简单地声明该协议,请参阅addendum to this answer。
答案 2 :(得分:1)
来自API docs:
此方法仅在正式的基础上确定一致性 头文件中的声明,如上所示。它没有检查 查看协议中声明的方法是否实际 实施 - 这是程序员的责任。
答案 3 :(得分:1)
从documentation你的班级符合协议,因为你在@interface
@interface Hat : NSObject <StandardQuality>
但是,您尚未实施price
方法。
有@required
和@optional
协议方法的概念。如果你绝对需要一个类来实现协议的全部或部分方法,你应该像这样指定它:
@protocol StandardQuality <NSObject>
@required
- (NSString *)color;
- (NSString *)fabric;
- (NSString *)store;
@optional
- (NSString *)price;
@end
在这种情况下,您应该检查实现协议的对象是否实际实现了可选方法而不调用它们。
我认为你正在寻找的更多。