Swift 4.1转换后框架公开协议及类无法在头文件显示
针对你把Swift 3.3框架升级到Swift 4.1后,公开类(比如CommunicationManager)和协议无法在头文件中找到的问题,我整理了几个针对性的排查和解决步骤:
检查框架的模块配置
首先确认Xcode项目的Build Settings里,Defines Module选项已设置为YES,同时Module Name保持正确(和你的框架名称一致)。Swift 4对模块的依赖更严格,这个选项如果关闭,公开符号无法被外部识别。显式添加
@objc修饰符
Swift 4改变了Swift类向Objective-C暴露的规则:默认情况下,public修饰的Swift类不会自动生成Objective-C兼容的头文件条目。如果你的框架需要给Objective-C代码调用,必须给公开类/协议加上@objc修饰:@objc public class CommunicationManager: NSObject { @objc public static let sharedInstance = CommunicationManager() }如果你想让类的所有公开成员都自动暴露给Objective-C,可以用
@objcMembers修饰整个类:@objcMembers public class CommunicationManager: NSObject { public static let sharedInstance = CommunicationManager() }对于公开协议,同样需要加上
@objc才能在Objective-C头文件中看到:@objc public protocol CommunicationProtocol { func sendMessage() }彻底清理并重新编译
除了清理派生数据,建议执行以下步骤确保没有缓存干扰:- 使用
Cmd + Shift + K清理项目构建缓存 - 退出Xcode,删除
~/Library/Caches/com.apple.dt.Xcode目录下的缓存文件 - 重新打开Xcode,先编译框架目标,再编译依赖它的项目
- 使用
区分Swift和Objective-C的访问场景
如果你的框架仅用于Swift项目,不需要依赖Objective-C头文件,那可以尝试在Swift项目中import你的框架后,直接使用CommunicationManager——Swift的公开符号在Swift环境中是可见的,只是不会出现在Objective-C的自动生成头文件里。如果是这种情况,头文件看不到属于正常现象。
内容的提问来源于stack exchange,提问作者Amogh Shettigar

