项目在 Swift 中时无法从 Objective-C 访问 swift 类

Posted

技术标签:

【中文标题】项目在 Swift 中时无法从 Objective-C 访问 swift 类【英文标题】:Can't access swift class from Objective-C while the project is in Swift 【发布时间】:2019-03-21 07:23:57 【问题描述】:

我有一个 swift 项目,我最初的 UIViewController 是一个 swift 类。

从最初的ViewController 开始,我在我的storyboard 中添加了一个新的Viewcontroller 并为其设置了一个objective-c 类(FirstViewController.h)。

在我的项目中,我有另一个 swift 类 (DataManager.Swift),它是NSObject 的子类。

现在我想在我的 objective-C 类 (FirstViewController.m) 中创建这个DataManager.swift 的实例。但不幸的是,我无法创建这个实例,给了我一个错误,比如 - Receiver 'DataManager' for class message is a forward declaration

我现在可以做些什么来解决这个问题?项目在 swift 中时是否可以从 Objectibe-C 类中访问 swift 类

我的FirstViewController.m

#import "FirstViewController.h"
@class DataManager;

@interface FirstViewController ()

@property (nonatomic, strong) DataManager *dataManager;

@end

@implementation FirstViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.
   _dataManager = [[DataManager alloc] init]; //This line giving me that error

@end

我的 DataManager.swift 类,

import UIKit;

@objc class DataManager: NSObject 
    var a: Int = 0

我的BridgingHeaderFile

#ifndef BridgingHeader_h
#define BridgingHeader_h
#import "FirstViewController.h"
#endif

【问题讨论】:

【参考方案1】:

您应该使用以下语法将 swift 模块导入 .m 文件:#import "ModuleName-Swift.h" 其中ModuleName 通常是您的项目名称。 注意:添加-Swift 后缀很重要!

还有@class DataManager;在导入后会是多余的。

【讨论】:

这只会成功一半 - 从 OPs Swift 代码示例来看,他还需要创建类 public 并将其所有属性/方法标记为 @objc public 以使其可见在 Obj-C 中。这当然取决于 OP 使用的 Swift 版本 - Swift 4.2 需要这些标记 如果模块名称中有“我的项目”这样的空格会怎样?导入“My Project-Swift.h”在这里不起作用。在这种情况下我应该如何导入这个? @Nuibb 是的,空格应该替换为“_”

以上是关于项目在 Swift 中时无法从 Objective-C 访问 swift 类的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 8 和 Swift 无法构建 Objective C 模块'FBSDKLoginKit'

从 Swift 测试文件中调用 Objective-C 类

无法在框架项目的 Objective-C 代码中导入 Swift 类

将 Swift 类添加到具有多个目标的 Objective-C 项目

无法在 Swift 项目中添加 Objective C 桥接头

无法在 Swift 项目中添加 Objective C 桥接头