在 Swift 项目中调用 OC 的 API
- 创建 OC 类时,Xcode 会提醒是否自动添加桥接文件。文件名为 {TargetName}-Bridging-Header.h
- 编写 OC 的 API
- Swift 调用 OC 的 API
- 同样可以手动添加桥接文件,需要项目配置中指定好桥接文件的路径
在 OC 项目中调用 Swift 的 API
- 创建 Swift 类时,Xcode 会提醒是否自动添加桥接文件。文件名为 {TargetName}-Bridging-Header.h
- 编写 Swift 的 API
只有继承 NSObject 的类才能被 OC 访问,另外给需要给 OC 使用的属性和方法添加 @objc 特性声明
- OC 调用 Swift 的 API
- 上面我们通过导入 oc_demo-Swift.h 文件,从而引用 Swift 的 API
这个文件是项目隐式创建的,你也可以对它重命名
Swift 调用 OC 的注意事项
在 Swift 的代码中,若使用 OC 的语法特性,或提供给 OC 调用,那么一般需要加上 @objc 来修饰。
- 提供给 OC 调用的属性和方法都必须显式添加 @objc
若希望类中所有的属性和方法都支持被 OC 调用,那么可以给类添加 @ objcMembers 声明
- 在 Swift 协议中给方法添加可选特性 optional,这时需要添加 @objc
@objc protocol MyProtocol {
@objc optional func method1()
@objc func method2()
}
class MyClass: MyProtocol {
func method2() {
}
}
- 给 UIButton 的实例添加点击事件时,通过 #selector 指定按钮点击的响应方法,该方法需要添加 @objc
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(frame: CGRect(x: 20, y: 20, width: 100, height: 40))
button.setTitle("Login", for: .normal)
button.addTarget(self, action: #selector(onPress(button:)), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func onPress(button: UIButton) {
print(button.currentTitle!) // "Login"
}
}
- 将 Swift 整型关联值类型的枚举提供给 OC 调用,枚举成员的名词将有所变化
@objc enum MyEnum: Int {
case one = 1
case two = 2
}
MyEnum e = MyEnumOne;
- @objc 可以对类名进行重命名
@objc(GFUser)
class User: NSObject {
}
@objc(display:)
func show(text: String) {
}
- @objc 可以接受参数,比如对 get 方法进行重命名
@objc var fullName: String {
@objc(getFullName) get {
return "\(firstName) \(secondName)"
}
}
- @nonobjc 可以废除一个隐式 objc 特性,使其在 Objective-C 代码中不可用