简介
本文介绍一下,Swift、OC 的互相调用的方法。
两种情况,OC 中调用 Swift 的情况,和 Swift 中调用 OC 的情况。本文是在当前最新的环境下的操作,Swift 5、Xcode 11.3。
1、OC 中调用 Swift 的情况
在 OC 的项目中新建一个 Swift 的文件,在创建的同时,Xcode 会弹出提示是否创建桥接文件,选择创建,然后会发现 Xcode 会自动创建一个桥接文件 xxx-Bridging-Header.h
然后在 OC 的代码中导入头文件 #import "xxx-Swift.h" , 这个是 Xcode 自动生成的 Swift 转 OC 的接口头文件,项目名称命名,"项目名-Swift.h",这个在工程配置 Build Settings 中 Swift Compiler - General,可以看到。导入后,在 OC 文件中就可以使用 Swift 了。
如果出现报错,'xxx-Swift.h' file not found 需要设置一下配置信息,targets -> Build Settings -> 搜索 packaging 找到 Defines Module 设置为 Yes,然后重新编译就会成功了。
然后就是在 Swift 文件中编写代码,这里要注意想要在 OC 中使用 Swift 中的类,需要继承自 NSObject,属性和方法要想在 OC 中使用需要加上 @objc。
在 Swift 4 之前,如果你用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。
另外,如有需求需要 OC 和 Swift 中使用不一样的方法名或者类名,可以使用 @objc(xxx) 转换成希望用到的名字。
//swift 文件
import Foundation
class Person: NSObject {
@objc var name: String?
var age: Int?
@objc func sayHello(name: String) {
print("hello \(name)")
}
@objc(greeting:)
func 打招呼(名字: String) {
print("你好,\(名字)")
}
}
//在 OC 中调用
#import "xxx-Swift.h"
Person *p = [[Person alloc] init];
[p sayHelloWithName:@"abc"];
[p greeting:@"123"];
点击导入的头文件,#import "xxx-Swift.h",跳转进去可看到系统将 Swift 转换后的代码:
2、Swift 中调用 OC 的情况
在 Swift 的项目中,新建一个 OC 的文件,同样也会创建一个桥接文件 xxx-Bridging-Header.h,在这个桥接文件用来导入要暴露给 Swift 要用的头文件。
创建好 OC 文件后,在 xxx-Bridging-Header.h 导入 OC 的头文件,然后再 Swift 代码中就可以使用了。
3、可能遇到的问题
在从 Swift 低版本升级的时候,可能会报错:
这是需要设置一下:
网友评论