OC 和 Swift 互调(.framework 中和普通项目中)
Framework
实现 OC 与 Swift 互调,外部可访问 OC 与 Swift 文件
前期准备:在 Framework 生成如图几个文件
其中 SwiftTest.swift 和 OCTest.h 供外部调用
TARGETS->Build Phases->Headers->Public,拖入umbrella header,再把 SwiftTest.swift 和 OCTest.h 拖进来
调用链:
外部 -> SwiftTest.swift->OCImportSwiftTest.h->SwiftImportOCTest.swift
外部->OCTest.h->SwiftImportOCTest.swift->OCImportSwiftTest.h
在.framework 中 Swift 调用 OC 方法
需要调用的 OC 类放到 umbrella header 里
Framework TARGETS->Build Settings->Packaging->Defines Modules 设为 YES
#import
//! Project version number for BaseBluetooth.
FOUNDATION_EXPORT double BaseBluetoothVersionNumber;
//! Project version string for BaseBluetooth.
FOUNDATION_EXPORT const unsigned char BaseBluetoothVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import
#import // 外部要调用.framework 的类
#import // Framework 中 Swift 要调用的 OC 类
设置后 Swift 可调用 OCImportSwiftTest.h
内的方法
在.framework 中 OC 调用 Swift 方法
需要被调用的 Swift 方法加上 @objc,再加上 public
在需调用 Swift 的 OC 文件中引入
#import
,要注意这里不是桥接文件
几个文件的内容:
SwiftImportOCTest.swift
public class SwiftImportOCTest: NSObject {
@objc public static func importObjectiveCTest(){
print("importObjectiveCTest")
let oc = OCImportSwiftTest()
oc.ocTest()
}
@objc public func swiftTest() {
print("swift func")
}
}
OCImportSwiftTest.h
#import
NS_ASSUME_NONNULL_BEGIN
@interface OCImportSwiftTest : NSObject
- (void)importSwiftTest;
- (void)ocTest;
@end
NS_ASSUME_NONNULL_END
OCImportSwiftTest.m
#import "OCImportSwiftTest.h"
#import
@implementation OCImportSwiftTest
- (void)ocTest {
NSLog(@"oc func");
}
- (void)importSwiftTest {
NSLog(@"importSwiftTest");
SwiftImportOCTest *swift = [[SwiftImportOCTest alloc]init];
[swift swiftTest];
}
@end
外部调用的 swift 和 oc 文件内容
SwiftTest.swift
import Foundation
public class SwiftTest: NSObject {
public static func test() {
print("swift test")
let oc = OCImportSwiftTest()
oc.importSwiftTest()
}
}
OCTest.h
#import
NS_ASSUME_NONNULL_BEGIN
@interface OCTest : NSObject
+(void)test;
@end
NS_ASSUME_NONNULL_END
OCTest.m
#import "OCTest.h"
#import
@implementation OCTest
+(void)test {
NSLog(@"OC test");
[SwiftImportOCTest importObjectiveCTest];
}
@end
外部调用
import UIKit
import BaseBluetooth // Framework
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
testBtn.addTarget(self, action: #selector(testTUI), for: .touchUpInside)
}
lazy var testBtn: UIButton = {
let btn = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 60))
btn.backgroundColor = .red
view.addSubview(btn)
return btn
}()
@objc func testTUI(){
SwiftTest.test()
print("============")
OCTest.test()
}
}
输出
可看到调用链