我尝试在我的应用程序中集成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
    }
}

当前回答

XCode 11.3.1:

当我想在objc代码中使用Swift内部类时,它不会编译错误“未定义的符号”(对于麻烦的内部类和外部类),我检查了生成的“-swift.h”头,两个类都在那里。

在尝试了几个小时后,我将内部类转换为普通类,并进行编译。

我清理项目,删除DerivedData文件夹,然后进行编译。

其他回答

我也遇到了同样的问题,最后我发现他们的目标不同。 ObjC类附加到Target1和Target2, Swift类只附加到Target1,在ObjC类中不可见。

希望这能帮助到一些人。

我有同样的问题,原来模块名称中的特殊符号被xcode取代(在我的情况下,破折号最终成为下划线)。在项目设置中检查“模块名称”以查找项目的模块名称。之后使用ModuleName-Swift.h或在设置中重命名模块。

我刚刚发现,在项目中添加swift文件目录是行不通的。您需要首先为该目录创建一个组,然后添加swift文件…

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

产品模块名称: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!")
       }
   }

我花了大约4个小时试图在我的基于Xcode Objective-C的项目中启用Swift。我的myproject-Swift.h文件创建成功,但我的Xcode没有看到我的swift类。所以,我决定创建一个新的基于Xcode对象的项目,最后,我找到了正确的答案!希望这篇文章能帮助到一些人:-)

Step by Step Swift integration for Xcode object -based project:

Create new *.swift file (in Xcode) or add it by using Finder. Create an Objective-C bridging header when Xcode asks you about that. Implement your Swift class: import Foundation // use @objc or @objcMembers annotation if necessary class Foo { //.. } Open Build Settings and check these parameters: Defines Module : YES Copy & Paste parameter name in a search bar Product Module Name : myproject Make sure that your Product Module Name doesn't contain any special characters Install Objective-C Compatibility Header : YES Once you've added *.swift file to the project this property will appear in Build Settings Objective-C Generated Interface Header : myproject-Swift.h This header is auto-generated by Xcode Objective-C Bridging Header : $(SRCROOT)/myproject-Bridging-Header.h Import Swift interface header in your *.m file. #import "myproject-Swift.h" Don't pay attention to errors and warnings. Clean and rebuild your Xcode project. Profit!