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

标签 objective-c interface protocols

我正在尝试将代码写入接口(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/

相关文章:

objective-c - 根据按键更改 NSPopUpButton 项目的可见性

ios - 如何在 AFNetworking 2.0+ 中使用 AFHTTPRequestOperationManager 使用 cookie?

ios - 如何在 objective c 中使用 swift 文件

java - UML 中的接口(interface)和抽象类聚合

java - 通过以太网转换器连接RS485设备

ios - 如何声明具有符合协议(protocol)的具体返回类型的函数?

swift - 应用于多种类型的协议(protocol)扩展

ios - 如何在不使用 sender.tag 方法的情况下管理 UItableViewCell 中的 UIbutton?

javascript - Typescript 接口(interface)作为一系列 OR 接口(interface)

java - Loop 中使用的接口(interface)实现