我正在尝试将代码写入接口(interface)(或 Objective C 术语中的协议(protocol)),而不是实现。
在对对象调用方法之前检查对象是否符合协议(protocol)以防止崩溃至关重要。
三种方式
- 在编译器中
- 在运行时
- 两者
最佳解决方案...肯定是第一吗?
我认为最好的方法是在编译器中:
- 如果你搞砸了,请注意
- 消除 conformsToProtocol:/respondsToSelector: 样板
- 在运行时如果你犯了错误就太晚了——你能做的最好的事情就是不执行代码/显示错误
但我看到很多代码在运行时执行此操作。为什么?
是否是可读性问题 - 需要 id <Protocol>
无处不在?
我的问题
确保对象符合接口(interface)/协议(protocol)的最稳健和可读的方法是什么?
代码
<强>1。 checkin 编译器
@interface ReportController : NSObject {
id <ReportGenerator> generator;
id <ReportSender> sender;
id report;
}
@implementation ReportController
-(id)initWithReportGenerator:(id <ReportGenerator>)generator_
reportSender:(id <ReportSender>)sender_ {
// Usual init stuff
generator = generator_;
sender = sender_;
return self;
}
-(void)generateAndSend {
report = [generator generate];
[sender sendReport:report];
}
@end
<强>2。在运行时检查
@interface ReportController : NSObject {
id generator;
id sender;
id report;
}
@implementation ReportController
-(id)initWithReportGenerator:(id)generator_
reportSender:(id)sender_ {
// Usual init stuff
generator = generator_;
sender = sender_;
return self;
}
-(void)generateAndSend {
if ([generator conformsToProtocol:@protocol(ReportGenerator)] &&
[sender conformsToProtocol:@protocol(ReportSender)]) {
report = [generator generate];
[sender sendReport:report];
} else {
[NSException raise:NSInternalInconsistencyException format:@"Objects didn't respond to protocols..."];
}
}
@end
最佳答案
您应该同时使用两者。考虑例如:
@protocol Proto
- (void)someFunction;
@end
@interface C : NSObject
- (void)proto:(id<Proto>)p;
@end
// ...
NSString *s = @"moo";
id i = s;
C *c = [[C alloc] init];
[c proto:s]; // warns
[c proto:i]; // doesn't warn
Objective-C 和 Cocoa 过于动态,通常无法在编译时检查此类内容(NSProxy
标准,动态添加方法和协议(protocol)的类,...)。
在编译时尽可能多地捕获此类错误固然很好,但仅此还不够。
关于objective-c - 确保对象符合 Objective C 中的接口(interface)/协议(protocol)的最健壮和可读的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9342921/