gpt4 book ai didi

objective-c - 确保对象符合 Objective C 中的接口(interface)/协议(protocol)的最健壮和可读的方法是什么?

转载 作者:行者123 更新时间:2023-12-02 07:42:41 25 4
gpt4 key购买 nike

我正在尝试将代码写入接口(interface)(或 Objective C 术语中的协议(protocol)),而不是实现。

在对对象调用方法之前检查对象是否符合协议(protocol)以防止崩溃至关重要。

三种方式

  1. 在编译器中
  2. 在运行时
  3. 两者

最佳解决方案...肯定是第一吗?

我认为最好的方法是在编译器中:

  • 如果你搞砸了,请注意
  • 消除 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com