在Objective-C视图控制器中引用Swift AppDelegate报错,求解决方法
解决Objective-C中引用Swift AppDelegate的"Unknown type name"错误
嘿,我来帮你搞定这个问题!你遇到的"Unknown type name"错误,主要是因为Objective-C没有正确识别到Swift写的AppDelegate类,下面是一步步的解决办法:
1. 确保Swift AppDelegate对Objective-C可见
Swift类默认不会暴露给Objective-C,你需要在AppDelegate类上添加@objcMembers修饰符,这样它的所有属性和方法都会对Objective-C开放。修改你的Swift AppDelegate代码:
@objcMembers class AppDelegate: UIResponder, UIApplicationDelegate { // 你的CoreData相关代码,比如persistentContainer let persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "YourDataModelName") container.loadPersistentStores(completionHandler: { (storeDescription, error) in if let error = error as NSError? { fatalError("Unresolved error \(error), \(error.userInfo)") } }) return container }() // 其他AppDelegate方法... }
如果不想开放所有成员,也可以单独给需要被Objective-C访问的属性(比如persistentContainer)添加@objc修饰符。
2. 导入正确的自动生成头文件
你不需要直接导入AppDelegate.swift,Objective-C调用Swift代码时,需要导入Xcode自动生成的项目名-Swift.h文件。注意项目名里的连字符会被替换成下划线,比如你的项目是SPOTEVENT-EventNotificationApp,对应的头文件应该是:
#import "SPOTEVENT_EventNotificationApp-Swift.h"
这个文件是Xcode自动生成的,你可以在项目的Build Settings里找到"Objective-C Generated Interface Header Name"选项,确认它的名称是否正确。
3. 修正获取AppDelegate实例的代码
现在你可以正确获取AppDelegate实例并拿到CoreData的上下文了,修正后的代码如下:
// 在你的Objective-C视图控制器方法内部 AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext; // 接下来就可以用context来处理NSMutableArray里的数据,存入CoreData了
4. 额外的排查步骤
- 执行清理项目(快捷键Cmd+Shift+K),然后重新编译,有时候缓存会导致类型识别失败
- 确认你的CoreData数据模型名称和AppDelegate里的
NSPersistentContainer初始化名称一致 - 检查Build Settings里的"Defines Module"选项是否设置为
YES,这是Swift和Objective-C互操作的必要条件
内容的提问来源于stack exchange,提问作者FarasatNiazi
相关产品推荐
相关产品推荐

