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

Posted

技术标签:

【中文标题】我如何从目标 c 代码中获取 Swift AppDelegate 的参考【英文标题】:How I can get reference of Swift AppDelegate from objective c code 【发布时间】:2017-02-28 10:54:14 【问题描述】:

我的项目在 Swift 3.0 中,我正在使用 xCode8.2。我需要在我的 swift 项目中导入目标 C 代码。目标 C 需要应用程序委托参考。如何从我的目标 C 代码中获得快速的 appdelegate 参考?

在我的目标 C 文件中 #import "AppDelegate.h" 给出了找不到错误,因为它是 swift AppDelegate

【问题讨论】:

您是否使用目标 c 代码形成您的 swift 代码?是否通过应用程序委托快速初始化? 我的项目在 Swift 中,我有一个在 Objective C 中构建的模块。在那个 Objective C 模块中它需要 appdelegate 参考。 我需要反过来。从 Objective c 代码中,我需要 swift appdelegate 的参考。 #import "AppDelegate.h" 给出未找到错误,因为它是 swift AppDelegate 【参考方案1】:

正如 Kie 已经说过的,你需要在你的 Obj-C .m 文件中 #import "<ProductModuleName>-Swift.h" 来获取所有 Swift 类。这是一个包含您需要的示例项目https://github.com/aminbenarieb/Researches/tree/master/Swift/Swift_ObjC。

更新: 如果你在 Objective-C 文件中看不到 Swift 文件,请确保你有Objective-C bridging header,如下Apple Documentation:

将 Objective-C 导入 Swift

在与您的应用程序目标相同的应用程序目标中导入一组 Objective-C 文件 Swift 代码,你依靠一个 Objective-C 桥接头来暴露那些 文件到 Swift。 Xcode 提供在您添加一个 Swift 文件到现有的 Objective-C 应用程序,或 Objective-C 文件到 一个现有的 Swift 应用程序。

【讨论】:

我做了类似的事情,就像你的 Foo.m 一样,我在 ObjC.m 文件中添加了 #import "MyProjectName-Swift.h 。但它说找不到 MyProjectName-Swift.h 文件。 @AvijitDas, 1. 要下载代码,请确保在您的机器上安装了 git 并 - 在终端中运行:git clone https://github.com/aminbenarieb/Researches.git Researches cd Researches git filter-branch --prune-empty --subdirectory-filter Swift/Swift_ObjC HEAD - 否则您手动 download project 并找到 SwiftObjC 项目文件夹。你加了Objective-C bridging header 了吗?【参考方案2】:

我不确定这是否能回答您的问题。

在 Swift 中获取 AppDelegate

您可以从 Swift 调用 Objective-C 代码,如果您的 Objective-C 代码需要 AppDelegate 才能在某些调用中工作,您可以通过在 Swift 中调用 UIApplication.shared.delegate 来解决此问题。

let appDelegate = UIApplication.shared.delegate as! AppDelegate

在 Objective-C 中获取 AppDelegate

如果您在 Objective-C 代码中需要 AppDelegate,那就这样:

#import "<ProductModuleName>-Swift.h" // You have to replace with your swift module name
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

【讨论】:

我需要反过来。从 Objective c 代码中,我需要 swift appdelegate 的参考。 #import "AppDelegate.h" 给出未找到错误,因为它是 swift AppDelegate 我编辑了我的答案。为了真正帮助您,如果您下次可以发布一些代码会有所帮助。谢谢。 我猜这是因为您没有弄清楚如何导入您的 swift 标头。我添加了一行,但这仅在您的 Objective-C 代码在同一目标中编译时才有效。更多信息在这里:developer.apple.com/library/content/documentation/Swift/… Btw:我不认为这是一个很好的投票,因为我正在努力帮助你,尽管你提供的信息是缺乏的。 很抱歉投了反对票,因为我认为您没有得到我的问题,并且您正在以相反的方式回答。我刚刚看到你的评论并撤消它。 developer.apple.com/library/content/documentation/Swift/…这个链接我看到了。我在目标 C 类中给出了 "#import "MyProjectBundleName-Swift.h"。但是当我试图编译它时没有找到头文件。 嗨,它成功了,谢谢。我需要根据***.com/questions/24102104/… 中的说明在我的构建设置中进行一些设置【参考方案3】:

为 Kie 和 Amin 的答案增添色彩:我一直在努力思考如何将 #import "&lt;ProductModuleName&gt;-Swift.h" 改编成对我的项目有意义的东西。我收到了头文件未找到编译时错误,结果发现ProductModuleName 中的非字母数字字符在创建桥头时被下划线替换。就我而言,产品名称中有一个空格;一旦我用下划线替换了空格,编译时错误就解决了。现在看起来微不足道,但我才刚刚开始。

这是对 Apple 文档和相关 sn-p 的参考:

标头名称由您的产品模块名称生成,后跟“-Swift.h”。默认情况下,此名称与您的产品名称相同,任何非字母数字字符都替换为下划线 (_)。如果名称以数字开头,则第一位数字将替换为下划线。

Importing Swift into Objective-C

【讨论】:

以上是关于我如何从目标 c 代码中获取 Swift AppDelegate 的参考的主要内容,如果未能解决你的问题,请参考以下文章

无法在目标 C 中调用 swift 函数。获取 NSObject 的错误接口声明

如何从目标 c 中的 pod 文件访问我的 swift 项目文件?

如何从 Swift 类中检索目标 C 类中的 Userdefault?

如何在目标c中使用swift文件

如何在目标 c-swift 桥接项目中使用 intentdefinition 文件?

如何从 Swift 单元测试访问测试目标中存在的 Objective-C 代码?