【问题标题】:How do I call Swift code from Objective-C in a Framework target?如何在框架目标中从 Objective-C 调用 Swift 代码?
【发布时间】:2016-04-14 02:35:58
【问题描述】:

当您将 Swift 文件添加到 Objective-C 项目时,Xcode 将生成一个 Swift-to-ObjC 标头,如下所述:http://ericasadun.com/2014/08/21/swift-calling-swift-functions-from-objective-c/

没有这个头文件就不可能从 Objc-C 调用 Swift 代码。但是 Xcode 不会为我的框架目标自动生成此标头。

如果我创建了一个 Objective-C app 并将一个 Swift 文件放入其中,那么它会自动生成一个,所以我怀疑这是因为我正在构建一个框架而不是一个应用程序。没有它就无法使用 Obj-C 代码中的 Swift 代码。

我尝试使用为应用程序生成的那个(在重命名它并将其放入适当的 DerivedData 文件夹之后),但 Xcode 没有更新它,实际上它最终会删除它,所以手动创建或尝试维护它文件不可行。

如何让 Xcode 为框架目标生成此标头,以便我可以从我的 Obj-C 代码调用我的 Swift 代码?

请记住伙计们:问题是关于从 Obj-C 调用 Swift 而不是从 Swift 调用 Obj-C。

【问题讨论】:

  • 你需要什么?桥接头还是生成的 Obj-C 接口?
  • 我需要能够将 Swift 源文件添加到 Obj-C 框架并能够从 Obj-C 代码中调用 Swift 类。
  • 你有什么问题?
  • 没有生成 Swift 桥接头。如果没有 Swift 桥接头,就不可能从同一代码库中的 Obj-C 代码调用 Swift 代码。
  • 有趣,我刚刚建立了一个测试项目,似乎有一个catch-22。除非我在 Swift 编译器构建设置中指定桥接头,否则 Xcode 不会生成“FrameworkName-Swift.h”文件,但如果我这样做,则会收到“不支持将桥接头与框架目标一起使用”的错误消息

标签: objective-c xcode swift


【解决方案1】:

我创建了一个新的框架项目,添加了 Obj-C 和 Swift 文件,并且能够做到这一点:

// MyObjCClass.m

#import "MyObjCClass.h"
#import <MyFramework/MyFramework-Swift.h>

@implementation MyObjCClass
- (void)test {
    [[MySwiftClass alloc] init];
}
@end

请注意,您的 Swift 类必须是 public:

public class MySwiftClass: NSObject {
    // ...
}

更多信息可在Apple's Swift/Obj-C interop documentation“将 Swift 导入到 Objective-C”下找到。

【讨论】:

  • 看来public修饰符是关键。
  • 请注意,在我链接的文档中,它说:"[This header] 还包含标有 internal 修饰符的那些 如果您的应用程序目标具有 Objective-C 桥接标题。”
  • 是的,我尝试了internal,但没有成功,因为框架上不能有 Objective-C 桥接头
  • 在发布问题之前,我还创建了一个新框架,发现我无法像您所做的那样使用 MyFramework-Swift.h,而且我的课程公开的。但不同的是我在课程前加上@objc,有趣的是你没有。我会在没有它的情况下做更多的实验,看看会发生什么。
  • @objc 的存在不会影响它在我的示例项目中。据我所知,在导入标头时需要使用。
猜你喜欢
  • 2018-07-02
  • 2015-05-03
  • 2023-03-22
  • 1970-01-01
  • 2021-11-03
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多