我如何从目标 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 "<ProductModuleName>-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?