如何在目标 c 中引用 swift app 委托

Posted

技术标签:

【中文标题】如何在目标 c 中引用 swift app 委托【英文标题】:How to reference swift app delegate in objective c 【发布时间】:2018-01-09 11:20:24 【问题描述】:

我想在目标 C 视图控制器中引用 swift 应用程序委托,因为我想将放在 NSMutableArray 中的数据提交到 core data

我已经导入了

#import "SPOTEVENT-EventNotificationApp-Bridging-Header.h"
#import "AppDelegate.swift"

在目标 C 视图控制器中,但每当我尝试创建应用程序委托实例时,它都会出现错误

“未知类型名称”

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    AppDelegate   *appDelegate;
    NSManagedObjectContext *context;

【问题讨论】:

感谢 Uma Madhavi,但我必须在目标 C.m 文件的顶部使用什么样的导入 【参考方案1】:

Bridging Header 允许您在 Swift 中使用 Objective-C 代码。您需要导入 Generated Interface Header 才能在 Objective-C 中使用 Swift 代码

TargetBuild Settings 部分中,查找 Objective-C Generated Interface Header Name 设置。通常是<TargetName>-Swift.h

大多数情况下,您导入.m 文件以查看 Swift 类。

#import "MyTarget-Swift.h"

如果在 OC 中采用 Swift 协议,您可能需要导入到.h,但这可能会引入与桥接头的循环依赖关系,因此请谨慎。

如果 AppDelegate 类仍未显示,您可能需要将 @objc 添加到类声明中,或检查您的类是否使用了任何会阻止导出发生的 Swift 功能。可以Command-Clickimport语句查看header的内容,对调试很有用。

【讨论】:

嘿,Warren,我已将 Objective-C 生成的接口标题名称更改为 SPOTEVENT-EventNotificationAPP-Swift.h,就像你说的那样,并将其导入 .m 文件中,但它仍然给我错误。 为什么它仍然给我错误我需要在.h文件中导入一些东西吗? 我没有说任何关于改变值的事情。我说看看价值是什么并使用它。话虽如此,它应该仍然有效。你在看目标(不是项目)。当您 Command-Click 导入时会发生什么? .标题中是否存在 AppDelegate 声明? 我正在查看目标,它给出了错误 SPOTEVENT-EventNotificationAPP-Swift.h file not found【参考方案2】:

执行此步骤以在objective-c文件中使用swift文件。

1) #Import "YourProjectName-swift.h" in Objective-C (.m) file

2) 现在创建 AppDelegate 的实例,如下所示。

AppDelegate *appDel = (AppDelegate*)[[UIApplication sharedApplication] delegate];

注意:-您必须在项目中添加桥接头。

【讨论】:

我的文件夹和项目名称是 SPOTEVENT-EventNotificationApp。我在 ObjectiveC.m 文件中提到过它,例如 #import "SPOTEVENT-EventNotificationApp-swift.h" 但它仍然报错。 我是否必须在目标 C.m 文件中创建 APPdelegate.swift 的实例,并且我已经在我的项目中添加了桥接头

以上是关于如何在目标 c 中引用 swift app 委托的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 子类中引用目标 c 实例变量?

我如何从目标 c 代码中获取 Swift AppDelegate 的参考

为啥我在实现委托以将值从子 swift 类传递给父目标 C 类时出错?

翻译: Swift 中的委托保留周期 如何在“纯”Swift(没有@objc)中进行弱协议引用

swift - 当persistentContainer不在App委托方法中时如何从核心数据中删除所有数据

尽管桥接头工作正常,但无法在 Swift 中实例化 Obj C 类