我尝试在我的应用程序中集成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做它的工作,不要手动添加/创建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" 

嘭!

其他回答

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

希望这能帮助到一些人。

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

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

存档将成功进行测试

如何在objective - c项目或react本地项目中调用swift函数(也可以在swift框架中)

它也适用于react-native 遵循以下步骤:

打开生成设置并检查这些参数: 定义模块:YES

在AppDelegate.h

#import <React/RCTBridgeDelegate.h>
#import <UIKit/UIKit.h>

@class KB;

@interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate>

@property (strong, nonatomic) KB *appkb;

@end

在AppDelegate.m

#import "AppDelegate.h"
#import "ProductModuleName-Swift.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [self.appkb methodReceiveSwiftClass];
  [self.appkb methodEvents:event prop:properties];
}

@end

KB.swift

import Foundation
// import framework if using a swift framework in objective c or react native native modules.
@objc public class KB:NSObject{
  
  @objc public func methodReceiveSwiftClass(){
    //write anything here....
  }

  @objc public func methodEvents(_ event: String, prop: String){
    //write anything here
     //func with params
  }

}

ProjectModuleName-Bridging-Header.h

#import "React/RCTBridgeModule.h"
#import "AppDelegate.h"

对于那些以框架为目标的人来说可能也有帮助:

自动生成的头文件的import语句看起来与应用程序目标有点不同。除了在其他答案中提到的其他事情外,使用其他答案

#import <ProductName/ProductModuleName-Swift.h>

而不是

#import "ProductModuleName-Swift.h"

根据苹果关于框架目标的Mix & Match文档。