【问题标题】:Handlng duplicate interface处理重复接口
【发布时间】:2021-08-10 14:53:07
【问题描述】:

我是 Objective-c 的新手,我想要两个接口

我正在尝试减少代码中的对等依赖性,因此我移动了 .m 文件并创建了单个 .h 文件

我做了这个

@interface XyzHelper : NSObject <RCTBridgeModule>

+ (bool)isFlaggedAsRequested:(NSString * _Nonnull)handlerId;

+ (void)flagAsRequested:(NSString * _Nonnull)handlerId;

@end

@interface XyzHelper : RCTEventEmitter <RCTBridgeModule, AVAudioPlayerDelegate>

但上面写着Duplicate interface definition,这是有道理的

知道如何解决吗?

我在做什么?

我正在创建一个使用的库

  1. https://github.com/react-native-webrtc/react-native-incall-manager

  1. https://github.com/zoontek/react-native-permissions

我不希望用户 npm install 两个 repo(以及我可能拥有的其他 repo)而不是单个 repo npm install xyz

react-native-permissions 使用

@interface XyzHelper : RCTEventEmitter &lt;RCTBridgeModule, AVAudioPlayerDelegate&gt;

in-call manager 有这个

@interface XyzHelper : NSObject <RCTBridgeModule>

+ (bool)isFlaggedAsRequested:(NSString * _Nonnull)handlerId;

+ (void)flagAsRequested:(NSString * _Nonnull)handlerId;

@end

@interface XyzHelper : RCTEventEmitter <RCTBridgeModule, AVAudioPlayerDelegate>

我尝试了什么?

我尝试创建一个通用接口

@interface XyzHelper : RCTEventEmitter <RCTBridgeModule, AVAudioPlayerDelegate>
+ (bool)isFlaggedAsRequested:(NSString * _Nonnull)handlerId;
+ (void)flagAsRequested:(NSString * _Nonnull)handlerId;
@end

但这给出了 x86_64 架构的重复符号

【问题讨论】:

  • 您到底想达到什么目的?你想怎么用XyzHelper
  • @EmilioPelaez 更新问题
  • 所以你想拥有相同的类名,但有不同的实现?

标签: objective-c xcode react-native


【解决方案1】:

@interface XyzHelper 被声明了两次。当然这是一个 Duplicate 接口定义。相反,您可以扩展您的 XyzHelper 类。在 Objective-C 中通常被称为所谓的 category
给定一个像下面这样的类..

NS_ASSUME_NONNULL_BEGIN
@interface XyzHelper : RCTEventEmitter <RCTBridgeModule>
+ (bool)isFlaggedAsRequested:(NSString *)handlerId;
+ (void)flagAsRequested:(NSString *)handlerId;
@end
NS_ASSUME_NONNULL_END

扩展可能类似于以下示例。它不仅扩展了 XyzHelper,还声明它符合额外的协议。

@interface XyzHelper (SomeAudioPlayerExtension) <AVAudioPlayerDelegate>

@end

但是请记住,这样做时,当您想从前一个类实现中调用额外的协议方法时,您必须检查您的类对象是否符合特定协议。为什么?因为扩展建议您遵守协议,而所需的方法可能不可用,例如扩展实现无法加载或者您只是忘记实现它们(缺少符号)。或者它只是没有链接。无论如何,在调用任何协议方法之前至少检查一次一致性会更安全。

通常文件名应该通过在类名加上扩展名之后命名来表示它们包含扩展代码。所以:XyzHelper+SomeAudioPlayerExtension.hXyzHelper+SomeAudioPlayerExtension.m

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 2021-11-04
    • 1970-01-01
    • 2020-04-20
    • 2014-03-01
    • 2015-03-11
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多