从Objective-C类调用Swift函数
我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我创建了文件“从Objective-C类调用Swift函数,objective-c,swift,Objective C,Swift,我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我创建了文件“-bridgeing Header.h”和“-Swift.h” 对我来说,从Swift调用Objective-C函数很容易,但反向调用时我遇到了一个问题 所以我创建了一个简单的类“System.Swift” 现在我试着按照文档进行操作,并在-Swift.h文件中编写了这篇文章 @class System; @interface System : NSObject -(void)printSome; @e
-bridgeing Header.h
”和“-Swift.h
”
对我来说,从Swift调用Objective-C函数很容易,但反向调用时我遇到了一个问题
所以我创建了一个简单的类“System.Swift”
现在我试着按照文档进行操作,并在-Swift.h
文件中编写了这篇文章
@class System;
@interface System : NSObject
-(void)printSome;
@end
我已经在我的Objective-C类中导入了它。此时,在Objective-C代码的Objective C类(当前为UIViewController)中,我尝试调用“printSome”方法:
现在我有以下错误:
架构i386的未定义符号:“OBJC_类$\u系统”,
引用自:
“ObjectiveC\u class\u调用\u Swift\u对象”中的objc类引用。o ld:未找到架构i386的符号clang:错误:链接器
命令失败,退出代码为1(使用-v查看调用)
问题解决了,我以前在名为
-Swift.h
的Objective-C类中创建并包含了一个新的.h
文件,但正如我后来发现的,这一步不是必需的,因为编译器创建了必要的文件
只需将
-Swift.h
包含在你的课堂中,它就会起作用。这很奇怪,但它会起作用
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
应用程序将在-Swift.h中生成该类的接口
例如:
SWIFT类(“TtC10Project17220PLHelper”)
@接口PLHelper
- (void)notifyForDownloading:(NSDictionary*)userInfo李>
- (instancetype)初始化对象指定的初始化器; @结束
#import <YourProjectName-Swift.h>
#导入
单击该行,然后左键单击-跳转到定义
此文件应自动包含,而不是手动包含。假设我们有ProjectName“MyFirstProjectOnSwift”和swift类名“mySwiftClass”,Objective类为“MyObjectiveCLass” 以下步骤是:-
mySwiftClass*myClass=[mySwiftClass new];{在任何情况下都可以这样打电话 方法调用swift方法的任何位置。}
如果导入
-Swift.h
后仍然看不到类
确保您的类是一个本机类的子类(例如
UIViewController
),或者至少如果它只是一个实用程序类,则将其设为子类NSObject
。你的课程现在应该显示出来了。对于任何在这篇文章上绊倒的人来说,没有什么额外的提示,对于hwhom来说,其他答案都不起作用:你可能还必须将你的Swift课程声明为“公共”
例如:
@objc公共类myswitclass:NSObject{
在从Obj-C迁移到Swift的项目上,建议使用桥接/代理模式从Objective-C执行Swift代码
private var analytics: AnalyticsManager = AnalyticsManager()
@objc func refreshProperties() {
self.analytics.set(AnalyticsProperty.clientType)
}
导入基础
@objc类分析属性桥:NSObject{
private var analytics: AnalyticsManager = AnalyticsManager()
@objc func refreshProperties() {
self.analytics.set(AnalyticsProperty.clientType)
}
}
#导入“CallerModule.h”
#导入“MyProject Swift.h”
b打电话到桥上去
[[AnalyticsPropertyBridge新建]刷新属性];
好处:您的swift代码不会被@objc弄脏,因为代码是从objc调用的。随着时间的推移,您的项目中的objc将减少,最后新娘将被删除。如果有人仍然有问题,这里有一篇好文章
关于项目名称的说明,如果项目名称中有空格,请确保将其替换为下划线,例如,如果项目名称为“我的项目”,则需要包括:
#import <My_Project-Swift.h>
#导入
您有一个链接器错误。是:(1)Xcode在为您的Swift代码命名Objective-C桥接头和生成的头时使用您的产品模块名称而不是目标名称,还是(2)在将Swift生成的头导入到要从中访问Swift代码的Objective-C.m文件之前,请确保导入这些类型的Objective-C头?您的Objective-C代码中是否有:#导入“ProductModuleName Swift.h”?是的,我已经阅读了文档和“ProductModelName”的名称是currect…有一个bug,在构建设置中没有设置产品模型…我甚至设置了它…@petert你能更好地解释第二点吗?我写了所有我做的事情…问题解决了,我在我的项目调用中添加了一个新的.h文件-Swift.h,但这不是必需的,因为编译器只是创建了这个对象,即使我看不见它。我已经删除了我创建的新文件,现在运行得很好。Tnx petertYou可以回答您自己的问题-它可能会帮助其他人。带参数的函数如何?我无法访问带参数和返回值的Swift函数,也无法访问不带参数和返回值的Swift函数。我可以不知道为什么。我的Swift类是NSObjor,我导入了基础框架,类和函数有<代码> @ Objc前缀。<代码> -SWIFT.H./C>已经自动创建。令我头痛的是,我可以调用类本身,但里面没有任何函数。有人知道为什么吗?好例子。is-.Swift.h
(非型号
)
#import <My_Project-Swift.h>