我可以防止将扩展导出到 Objective-C 的 Swift 标头吗?

Posted

技术标签:

【中文标题】我可以防止将扩展导出到 Objective-C 的 Swift 标头吗?【英文标题】:Can I prevent extensions from being exported to Swift header for Objective-C? 【发布时间】:2018-01-04 13:54:17 【问题描述】:

我有一个带有 1 个 Swift 类的 Objective-C 项目。这个类使用的框架也是用 Swift 编写的。 (使用 CocoaPods 包含框架)

我的问题是 -Swift.h 文件正在导出我的扩展,这些扩展符合框架中的协议。现在,当我尝试在 Objective-C 中导入 -Swift.h 文件时,它抱怨找不到协议定义。

我不想导出这些扩展。它们只在这个类中使用。我不能将 private 或 fileprivate 用于声明协议一致性的扩展。我还尝试在扩展声明(将警告级联到我的方法)之前添加@nonobjc,它仍然被导出。

这是我的扩展:

extension MessagingExperience: MessagingDelegate 
    ...


extension MessagingExperience: MessagingNotificationDelegate 
    ...

并生成标题:

@interface MessagingExperience (SWIFT_EXTENSION(Reference_App)) <MessagingDelegate>
- (void)MessagingObseleteVersion:(NSError * _Nonnull)error;
- (void)MessagingError:(NSError * _Nonnull)error;
@end


@interface MessagingExperience (SWIFT_EXTENSION(Reference_App)) <MessagingNotificationDelegate>
- (BOOL)shouldShowMessagingNotificationWithNotification:(MessagingNotification * _Nonnull)notification SWIFT_WARN_UNUSED_RESULT;
- (void)messagingNotificationTapped:(MessagingNotification * _Nonnull)notification;
- (UIView * _Nonnull)customMessagingNotificationViewWithNotification:(MessagingNotification * _Nonnull)notification SWIFT_WARN_UNUSED_RESULT;
@end

在 Objective-C 类中包含 -Swift.h 产生的错误:

找不到“MessagingDelegate”的协议声明

找不到“MessagingNotificationDelegate”的协议声明

有没有办法防止它出现在标题中?

谢谢。

【问题讨论】:

【参考方案1】:

在 MessagingExperience.swift 中创建一个符合框架中定义的协议的私有类。因为是私有类,所以生成的-Swift.h中不会指定协议。

【讨论】:

以上是关于我可以防止将扩展导出到 Objective-C 的 Swift 标头吗?的主要内容,如果未能解决你的问题,请参考以下文章

Vue CLI 3 防止某些输出文件的缓存破坏

Chrome 扩展:本地存储,如何导出

SwiftUI:防止 Image() 将视图矩形扩展到屏幕边界之外

将 BigQuery 表的并发导出扩展到 Google Cloud Storage

将 SCSS 变量导出到 JS(自动循环变量)

如何防止 LaTeX 连字符包含破折号的单词?