我尝试在我的应用程序中集成Swift代码。我的应用程序是用Objective-C编写的,我添加了一个Swift类。我做了这里描述的所有事情。但我的问题是Xcode还没有创建-Swift.h文件,只有桥接头。我创建了它,但它实际上是空的。 我可以在Swift中使用我所有的ObjC类,但我不能反之亦然。我用@objc标记了我的swift类,但它没有帮助。我现在该怎么办?

编辑:苹果说:“当你将Swift代码导入Objective-C时,你依靠xcode生成的头文件将这些文件公开给Objective-C。[…此头文件的名称是您的产品模块名称,后跟“-Swift.h”。

现在当我想导入这个文件时,它会给出一个错误:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

这是我的FBManager.swift文件:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

当前回答

当您向项目添加新的Swift文件时,请确保您将它们添加到正确的目标。 请确保你要使用的每个swift文件都继承了NSObject类,并带有@ObjCMembers注释 在ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES选项下的构建设置中更改为YES。 在选项DEFINES_MODULE下的构建设置中更改为YES。

其他回答

@sig的答案是最好的之一,然而,它并不适用于我的旧项目(不是新的!),我需要一些修改。经过大量的变化,我找到了我的配方(使用XCode 7.2):

产品模块名称:$(PRODUCT_NAME:c99extidentifier) 定义模块:NO 嵌入式内容包含Swift: NO 安装Objective-C兼容性头:YES Objective-C桥接头:ProjectName-Bridging-Header.h

最后一点(5)至关重要。我只把它放在第二部分(目标字段),项目字段应该是空的:否则,它不会为我生成正确的“Project- swift .h”文件(它不包括swift方法)。

对于Swift 5:

将@objc关键字添加到类和方法中 向类和方法添加public关键字 让你的类继承自NSObject 建设项目 在Objective-C文件中输入“MyProject-Swift.h” @objc MyClass: NSObject { @objc myMethod() { } }

不要自己创建头文件。删除您所创建的。

确保你的Swift类被标记为@objc,或者继承自(直接或间接)从NSObject派生的类。

如果你的项目中有任何编译器错误,Xcode不会生成文件-确保你的项目构建干净。

在我的例子中,除了这些步骤:

产品模块名称:myproject 定义模块:YES 嵌入式内容包含Swift:是 安装Objective-C兼容性头:YES Objective-C桥接头:$(SRCROOT)/Sources/SwiftBridging.h

我需要把类作为公共的,以创建productName-Swift.h文件:

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

允许Xcode做它的工作,不要手动添加/创建Swift头。只需要在你的Swift类ex之前添加@objc。

@objc class YourSwiftClassName: UIViewController

在你的项目设置中搜索以下标志,并将其更改为YES(项目和目标)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

然后清理项目并构建一次,在构建成功后(可能应该)在objective-c类.m文件中导入下面的头文件

#import "YourProjectName-Swift.h" 

嘭!