Objective-C桥接头报错:Swift与OC互调时Sonic-Swift.h未找到
这明显是循环依赖搞出来的坑,我给你拆解下问题根源和修复步骤:
你的AppState是Objective-C类,它引用了Swift自动生成的头文件Sonic-Swift.h(用来访问Swift类);但你又把AppState.h导入到了桥接头文件——而桥接头的作用是让Swift能访问Objective-C代码,这就形成了死循环:Xcode要生成Sonic-Swift.h得先编译Swift代码,可Swift编译又依赖桥接头里的AppState.h,AppState.h又需要Sonic-Swift.h才能编译,最终导致预编译头生成失败,还报出“文件未找到”的错误。
下面是具体的修复方案:
1. 移除桥接头文件中的AppState.h导入
别把依赖Swift代码的Objective-C类放进桥接头,这是循环的根源。桥接头只用来导入不依赖Swift代码的Objective-C类。
2. 在Swift文件中直接导入Objective-C模块
如果你的Objective-C代码属于Sonic这个Target,在需要使用AppState的Swift文件里直接写:
import Sonic // 正常使用AppState AppState.entity.append(YourSwiftEntity())
3. 修正Objective-C里的Swift类声明
你原来代码里NSMutableArray<"Swift class" *>的写法是错误的,要替换成实际的Swift类名,且这个Swift类必须标记@objc或@objcMembers才能被Objective-C识别。比如你的Swift类叫Entity,代码应改成:
#import "Sonic-Swift.h" @interface AppState : NSObject @property (class) NSMutableArray<Entity *> *entity; @end
4. 清理缓存并重建项目
Xcode的衍生数据经常会留缓存坑,先按Command+Shift+K清理项目,再Command+B重新编译。要是还不行,直接手动删除报错里提到的DerivedData目录:
/Users/krishna_mac_2/Library/Developer/Xcode/DerivedData/Apps-gqelclyzwvyomhcchmjjsejrznaw/
这套操作下来,循环依赖的问题就能解决,预编译头也能正常生成了。
内容的提问来源于stack exchange,提问作者Parv Bhasker

