在.framework 中,OC 和 Swift 互调

OC 和 Swift 互调(.framework 中和普通项目中)

Framework

实现 OC 与 Swift 互调,外部可访问 OC 与 Swift 文件

前期准备:在 Framework 生成如图几个文件


image-20210727111105146.png

其中 SwiftTest.swift 和 OCTest.h 供外部调用

TARGETS->Build Phases->Headers->Public,拖入umbrella header,再把 SwiftTest.swift 和 OCTest.h 拖进来

image-20210727113959066.png

调用链:

  1. 外部 -> SwiftTest.swift->OCImportSwiftTest.h->SwiftImportOCTest.swift

  2. 外部->OCTest.h->SwiftImportOCTest.swift->OCImportSwiftTest.h

在.framework 中 Swift 调用 OC 方法

  1. 需要调用的 OC 类放到 umbrella header 里

  2. 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 方法

  1. 需要被调用的 Swift 方法加上 @objc,再加上 public

  2. 在需调用 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()
    }
}

输出

image-20210727143341871.png

可看到调用链

你可能感兴趣的:(在.framework 中,OC 和 Swift 互调)