我有问题。我有一个旧的Objective C项目,我想调用新的Swift函数和对象,我创建了文件“-Bridging-Header.h”和“-Swift.h”
我很容易将函数从Swift调用到Objective C,但我有一个反向问题。
所以我创建了一个简单的类“System.Swift”
import Foundation
@objc class System : NSObject {
@objc func printSome() {
println("Print line System");
}
}
现在我尝试按照文档here和< ...> -Swift.h文件中的内容编写了这个
@class System;
@interface System : NSObject
-(void)printSome;
@end
我已经在Objective C Class中导入了它。在我的Objective C Code的Objective C类(当前是UIViewController)中,我尝试调用“printSome”方法:
- (void)viewDidLoad
{
[super viewDidLoad];
System * sis = [[System alloc] init];
[sis printSome];
//any additional setup after loading the view from its nib.
}
现在我有以下错误:
架构i386的未定义符号:“_ OBJC_CLASS _ $ _ System”, 引自: “ObjectiveC_Class_That_Call_Swift_Object”中的objc-class-ref .o ld:找不到架构i386 clang的符号:错误:链接器 命令失败,退出代码为1(使用-v查看调用)
有人可以帮助我吗?
关心所有。
答案 0 :(得分:38)
问题已解决,我之前在名为.h
的 Objective-C 类中创建并添加了一个新的<ProductModuleName>-Swift.h
文件,但正如我后来发现的那样,此步骤不是必需的因为编译器会创建必要的文件不可见。
只需在您的课程中加入<ProductModuleName>-Swift.h
即可。
答案 1 :(得分:33)
是的,谢谢
很奇怪,但它会起作用
1) Add @objc to Swift class
2) Add in .m
#import "(ProjectName)-Swift.h"
3) Call from .h
@class SwiftClass;
4)On SwiftClass
click "Command" + Left Click (Apple Documantation)
5) To see "-Swift.h" -> click "Command" + Left Click
App将在-Swift.h中为该类生成接口
实施例: SWIFT_CLASS( “_ TtC10Project17220PLHelper”) @interface PLHelper
答案 2 :(得分:26)
假设我们有ProjectName“MyFirstProjectOnSwift”和swift类名“mySwiftClass”,而objectiveC类是“MyObjectiveCLass”
以下步骤为: -
在“MyObjectiveCLass.m”中添加#import“MyFirstProjectOnSwift-Swift.h”
在MyObjectiveCLass.h中添加@class mySwiftClass;
然后在MyObjectiveCLass.m
中mySwiftClass * myClass = [mySwiftClass new]; {在任何人中都这样打电话 方法无论你想在哪里调用swift方法。}
- 醇>
[myClass methodName];
答案 3 :(得分:9)
检查-swift.h文件,该文件在Objective-C:./ / p>中的.m文件中有导入
#import <YourProjectName-Swift.h>
单击该行,然后单击鼠标左键 - 跳转到定义。
此文件应自动包含,而不是手动包含。
答案 4 :(得分:2)
如果您在导入<ProductModuleName>-Swift.h
后仍然没有看到您的课程。
确保您的类是子类化本机类(例如UIViewController
),或者至少如果它只是一个实用程序类,请将其作为子类NSObject
。你的班级现在应该展示。
答案 5 :(得分:0)
对于任何绊倒这篇文章的人和其他答案都没有用的小技巧:您可能还必须将Swift类声明为“ public”。
示例:
@objc public class MySwiftClass: NSObject {
答案 6 :(得分:0)
在从Obj-C迁移到Swift的项目上从Objective-C执行Swift代码的推荐方法是使用Bridge / Proxy模式。
import Foundation
@objc class AnalyticsPropertyBridge: NSObject {
private var analytics: AnalyticsManager = AnalyticsManager()
@objc func refreshProperties() {
self.analytics.set(AnalyticsProperty.clientType)
}
}
#import "CallerModule.h"
3.a导入伞形文件:
#import "MyProject-Swift.h"
3.b呼叫网桥。
[[AnalyticsPropertyBridge new] refreshProperties];
优点:因为从Objc调用了代码,所以@objc不会使您的快速代码变得肮脏。随着时间的流逝,ObjC将在您的项目中减少,最后新娘将被移除。
答案 7 :(得分:0)
关于项目名称的说明,如果项目名称中有空格,请务必用下划线替换,例如如果项目名称是“我的项目”,则需要包含:
#import <My_Project-Swift.h>
答案 8 :(得分:-1)
如果有人仍有问题,这里是一篇好文章。
Setting up Swift and Objective-C Interoperability