Xcode9 Swift4项目中如何在Objective-C文件调用Swift函数?
让Objective-C调用Swift代码的具体操作步骤(Xcode 9 + Swift 4)
我来帮你搞定这个问题!在Swift项目里让Objective-C调用Swift代码,核心是利用Xcode自动生成的模块名-Swift.h桥接文件,下面是一步步的操作:
1. 确认Xcode自动桥接文件的配置
- 打开项目的「Build Settings」,在搜索框输入
Objective-C Generated Interface Header Name,默认值是$(PRODUCT_MODULE_NAME)-Swift.h(比如你的项目叫MySwiftApp,这个文件就是MySwiftApp-Swift.h),记住这个文件名,后面要用到。 - 再搜索
Defines Module,确保它的值是YES(一般默认就是YES,但最好检查一下,这是生成桥接文件的前提)。
2. 让Swift代码对Objective-C可见
只有被@objc修饰的Swift类和方法,才能被Objective-C识别,具体分两种情况:
- 如果你的Swift类继承自
NSObject,默认会自动被@objc修饰,直接写方法就行:class MySwiftHelper: NSObject { // 这个方法默认对OC可见 func showMessage() { print("Hello from Swift!") } } - 如果是非
NSObject的子类,或者想让整个类的所有成员都对OC开放,需要手动添加修饰符:// 单个类加@objc,方法也要加@objc @objc class CustomSwiftTool { @objc func doTask() { print("Doing task from Swift!") } } // 用@objcMembers让类里所有属性、方法都对OC可见 @objcMembers class FullAccessSwiftClass: NSObject { var userName: String = "Guest" func greetUser() { print("Hi \(userName)!") } }注意:Swift的结构体、普通枚举(除非是继承
NS_ENUM的@objc枚举)、泛型这些类型,Objective-C是无法调用的,尽量用继承自NSObject的类。
3. 在Objective-C文件中导入自动生成的桥接文件
一定要在Objective-C的.m文件里导入,不要在.h文件里导入(避免循环引用问题):
// 替换成你的项目模块名对应的桥接文件名 #import "MySwiftApp-Swift.h"
如果不确定模块名,去Build Settings里搜索Product Module Name,那里的值就是你要填的前缀。
4. 在Objective-C中调用Swift代码
现在就可以正常创建Swift类的实例,调用方法了:
// 创建MySwiftHelper实例并调用方法 MySwiftHelper *swiftHelper = [[MySwiftHelper alloc] init]; [swiftHelper showMessage]; // 使用FullAccessSwiftClass的属性和方法 FullAccessSwiftClass *fullAccessObj = [[FullAccessSwiftClass alloc] init]; fullAccessObj.userName = "John"; [fullAccessObj greetUser];
常见问题排查
- 如果OC里找不到Swift类,先执行「Product -> Clean Build Folder」清理项目,再重新Build——因为自动桥接文件是Build之后才会生成的。
- 检查Swift类/方法的访问级别:必须是
internal(默认)或public,private修饰的成员OC是访问不到的。 - 确认桥接文件名拼写正确,尤其是模块名部分,别和项目名搞混(有时候项目名有特殊字符,Xcode会自动调整模块名)。
内容的提问来源于stack exchange,提问作者mab
相关产品推荐
相关产品推荐

