项目在 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'
无法在框架项目的 Objective-C 代码中导入 Swift 类
将 Swift 类添加到具有多个目标的 Objective-C 项目