一、Swift调用OC源码
实现的效果
创建SwiftUseOCTest项目,是一个Swift语言的项目;再创建一个OC类文件,里面有静态方法,实例方法,字段等;然后在Swift项目中调用OC类;像OC类的复杂宏,在Swift类中是无法调用。
实现方法
1.创建OC类文件,编写简单OC类属性方法等;
2.自动生成桥接文件;
3.在桥接文件(可以自动创建,也可以手动创建)中引用OC相关头文件,当前项目的OC,第三方框架的OC都要引用;
4.在Swift类文件中调用OC类属于和方法。
创建OC类
创建TestOCObject OC语言类文件,并继承自 NSObject
点击Next后,会弹窗提示自动创建桥接文件
编写TestOCObject.h ,声明属于和方法
//
// TestOCObject.h
// SwiftUseOCTest
//
// Created by jin on 2024/8/18.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//普通宏,可以在Siwft中访问
#define ICON_WIDTH 1228
//复杂宏
#define SCEREEN_WIDTH [[UIScreen mainScreen] bounds].size.width
//这是一个常量
static NSString * const ICON_NAME = @"sziitjin";
@interface TestOCObject : NSObject
@property (strong,nonatomic) NSString *var1;
/// 静态登录方法
/// @param name <#name description#>
/// @param age <#age description#>
+(NSString *)loginWithName:(NSString *)name age:(int)age;
/// 登录方法
/// @param name <#name description#>
/// @param age <#age description#>
-(NSString *)login11WithName:(NSString *)name age:(int)age;
@end
NS_ASSUME_NONNULL_END
编写TestOCObject.m ,实现属于和方法
//
// TestOCObject.m
// SwiftUseOCTest
//
// Created by jin on 2024/8/18.
//
#import "TestOCObject.h"
@implementation TestOCObject
- (instancetype)init{
self = [super init];
if (self) {
_var1 = [NSString stringWithFormat:@"%@ %@",@"这是变量1",ICON_NAME];
}
return self;
}
+ (NSString *)loginWithName:(NSString *)name age:(int)age{
return [NSString stringWithFormat:@"TestObject static loginWithName %@ %d",name,age];
}
- (NSString *)login11WithName:(NSString *)name age:(int)age{
return [NSString stringWithFormat:@"TestObject login11WithName %@ %d",name,age];
}
@end
编译一下项目,保证编写的OC类没有问题。
导入头文件
在桥接文件SwiftUseOCTest-Bridging-Header.h 中导入 TestOCObject OC类
//导入OC头文件,当前项目的,第三方框架的都要导入
#import "TestOCObject.h"
使用OC类
在Swift类文件 ViewController 中调用OC类属于和方法
//
// ViewController.swift
// SwiftUseOCTest
//
// Created by jin on 2024/8/18.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//调用OC类中的静态方法
var result = TestOCObject.login(withName: "jin", age: 18)
print(result)
//调用OC类中的实例方法
let testObject = TestOCObject()
result = testObject.login11(withName: "jin", age: 16)
print(result)
//-------------字段
print("变量:\(testObject.var1)")
print("常量:\(ICON_NAME)")
//-------------宏,只能访问普通的宏,复杂的宏不能访问
print("简单宏:\(ICON_WIDTH)")
//print("访问复杂宏:\(SCEREEN_WIDTH)")
}
}
查看log,成功实现在Swift类文件中调用OC类的属性和方法。
二、Swift调用OC第三方框架
如何实现
通过Pod安装依赖,然后在桥接文件中导入头文件,然后就可以使用了。
添加依赖
例如这里使用微信SDK作为演示,目前微信SDK是OC实现了:
#微信sdk,OC实现的
#https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/iOS.html
pod 'WechatOpenSDK'
安装依赖。还不了解如何使用 CocoaPods 管理依赖的,建议先看前面的文章:IOS 01 CocoaPods 安装与使用
在桥接文件中导入
SwiftUseOCTest-Bridging-Header.h
//微信SDK
#import <WechatOpenSDK/WXApi.h>
使用OC三方框架
在Swift类文件 ViewController 中调用OC第三方框架微信的方法WXApi.registerApp("", universalLink: "")
//
// ViewController.swift
// SwiftUseOCTest
//
// Created by jin on 2024/8/18.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//调用OC类中的静态方法
var result = TestOCObject.login(withName: "jin", age: 18)
print(result)
//调用OC类中的实例方法
let testObject = TestOCObject()
result = testObject.login11(withName: "jin", age: 16)
print(result)
//-------------字段
print("变量:\(testObject.var1)")
print("常量:\(ICON_NAME)")
//-------------宏,只能访问普通的宏,复杂的宏不能访问
print("简单宏:\(ICON_WIDTH)")
//print("访问复杂宏:\(SCEREEN_WIDTH)")
WXApi.registerApp("", universalLink: "")
}
}
能正常打开微信SDK的OC源码和项目运行成功,代表已成功在Swift代码中使用 OC第三方框架