我最近一直在努力将Swift添加到一个现有的项目中,以便在现实世界中进行尝试。

在向项目中添加Swift源文件时,我对获得“桥接头”没有任何问题,也就是说,Objective-C到Swift。

但是*-Swift.h头文件应该公开Swift类,无论是标记为@objc的类还是ObjC类的子类,都找不到:-(

在我的主应用程序代码(仍然是Objective-C)中,我没有看到任何关于如何使用我的新子类的具体说明,用Swift编写。

我是首席开发人员的应用程序有一个相当大的代码库(70.000行),所以一次性过渡它是不可能的。


当前回答

如果Xcode实际上生成了你的-Swift.h头(在DerivedData的深处),但它没有引用你的Swift类,请确保你也定义了一个桥接头。我阅读文档的方式暗示我只需要从Swift调用Objective-C,但似乎从Objective-C调用Swift也是必要的。

请看我的回答:https://stackoverflow.com/a/27972946/337392

编辑:这是因为公共和内部访问修改器,正如我最终在苹果文档中发现的解释:-

默认情况下,生成的头包含Swift接口 用公共修饰符标记的声明。它还包含了 如果你的应用目标有 Objective-C桥接头。

其他回答

在我的情况下,我必须将部署目标设置为至少“OS X 10.9”,并且-Swift.h头文件会自动生成。请记住,当您更改部署目标版本时,您可能会得到许多弃用警告,特别是当您有一个旧的和非常大的Objective C代码库时。在我们的例子中,我们在XIB文件和视图类中也有很多工作要做。

唯一重要的是:*

在目标中使用定义的“产品模块名”,后跟-Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

无论“定义模块”参数设置为“是”或“否”,或“产品模块名称”项目未设置。

提醒:Swift类必须派生自NSObject或被标记为@objc属性,以便暴露给ObjectiveC / Foundation || Cocoa…

我发现我必须在它生成文件之前修复所有构建错误。

对我来说,问题是这是一个先有鸡还是先有蛋的问题,因为在我注释掉#import语句之前,我没有看到任何构建错误:

/ / #进口“ProductModuleName-Swift.h”

这显示了我的Swift代码中的一堆其他错误。

一旦我修复了这些新的错误,并成功地获得了源代码构建,我取消了#import的注释,没错!头文件被创建并正确导入:)

我很难确定我的模块名/objective-c对swift头文件的导入。我在这里也读了很多文章。

但你的项目名称的最终答案,包括所有的特殊字符(是它'。’或数字或空格)-你可以在目标的Build Settings下的“Product Module Name”中找到适合你的文本。

例如,我的目标名称以数字-“1mg”开头,上面提到的字段显示“_mg”作为我的模块名。

所以我使用#import "_mg-Swift.h",它工作了。

项目中不创建实际文件([ProductModuleName]-Swift.h)。Cmd +单击导入,要么实时生成(并在内存中),这样你就可以看到链接是如何完成的,要么在Xcode缓存目录中打开一个文件,但它不在项目目录中。

你需要将定义模块项目道具(在目标的构建设置中)设置为Yes,如果你的模块名中有空格或破折号,在[ProductModuleName]- swift .h文件的所有导入中使用_。

你可以在所有使用swift类型的.h和.m文件中导入它,也可以在.pch文件中导入它。

所以如果我的模块(项目)被命名为“测试项目”,我将像这样导入它,在我的项目的。pch文件中(就在那里):

#import "Test_Project-Swift.h"