IOS 05 OC和Swift混合编程

为什么需要使用OC和Swift混合编程?

在真实项目开发过程中,大部分时候我们往往都会使用到OC和Swift混合编程,主要原因如下:

  • 老项目是OC语言实现的,但需要引用Swift的框架;
  • 新项目是Swift实现的,但需要引用OC的框架,就目前微信SDK,支付宝SDK等都是OC实现的。

如何实现?

1、通过官方提供桥接文件这种机制实现。

2、手动创建桥接文件。

实现的效果

在OC语言的项目中,创建一个Swift类文件,里面有静态方法,实例方法,字段,然后在OC中调用;像Swift中枚举就无法再OC调用。

实现方法

  • 创建Swift文件,类继承NSObject,方法和字段前面加@objc,如果不加OC中无法调用,但编译不报错。
  • 创建桥接文件,第一次创建Swift文件时,会提示是否创建桥接文件,可以点击自动创建;也可以稍后手动创建,手动创建,还要开启在target-Build Settings-All中,找到Defines Module,设置为Yes;同样在Swift项目中第一次创建OC文件时也会提示。
  • 在要使用Swift类的OC文件中导入自动生成的Swift兼容文件,和桥接文件。
  • 在OC中使用Swift中的类。

创建Swift类

一个Swift如果要在OC中使用,必须继承NSObject;其他内容(方法,字段)如果要在OC中使用,前面必须加@objc;注意:更改完代码,一定要要编译,OC那边才能引用。

//  目的是测试在OC中调用这个类的方法和字段
//  一个Swift如果要在OC中使用,必须继承NSObject
//  其他内容(方法,字段)如果要在OC中使用,前面必须加@objc
//  注意:更改完代码,一定要要编译,OC那边才能引用

//
//  TestSwiftObject.swift
//  OCUseSwiftTest
//
//  Created by jin on 2024/8/16.
//

import UIKit

class TestSwiftObject: NSObject {
    
    @objc var var1 :String = "这是变量"
    
    @objc let let1 :String = "这是常量"
    
    @objc static let staticLet :String = "这是静态常量"
    
    /// 静态计算属性
    @objc open class var staticComputer:String {
        let result =  10*2
        return "这是静态的计算属性\(result)"
    }
    
    /// 计算属性
    @objc open var computer:String{
        get{
            let result = 10*3
            return "这是计算属性\(result)"
        }
    }
    
    /// 懒加载字段
    @objc lazy var lazyField: String = {
        let result = 20*12
        print("TestSwiftObject lazyField 这里的逻辑只会执行一次")
        return "这是懒加载字段\(result)"
    }()
    
    /// 静态登录方法
    @objc static func login(name:String, age :Int) -> String{
        return "name \(name) age \(age)"
    }
    
    /// 登录方法
    @objc func login2(name:String, age :Int) -> String{
        return "name \(name) age \(age)"
    }

}

自动提示创建桥接文件

点击创建按钮

Defines Module,设置为Yes

选中项目文件 --> Build Setting --> 搜索Defines Module --> 设置为Yes

(CSDN又犯病了,无法上传图片,只能贴出步骤文本)

导入头文件

在要使用Swift类的OC的.m 文件中导入桥接文件的头文件

//导入桥接文件
#import "OCUseSwiftTest-Bridging-Header.h"

//如果当前项目有Swift文件,需要在targets的Build Settings将Defines Module设置为YES
//然后编译项目,就会自动生成该文件,这个文件在Xcode中看不到,但可以直接引用
//引用以后,才能在当前文件使用当前项目的Swift源码里面的内容
#import "OCUseSwiftTest-Swift.h"

OC使用Swift类

//
//  ViewController.m
//  OCUseSwiftTest
//
//  Created by jin on 2024/8/16.
//

#import "ViewController.h"

//导入桥接文件
#import "OCUseSwiftTest-Bridging-Header.h"
#import "OCUseSwiftTest-Swift.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    //-------------方法测试
    
    //调用Swift类中的静态方法
    NSString *result = [TestSwiftObject loginWithName:@"jin" age:16];
    NSLog(@"%@",result);
    
    //调用Swift类中的实例方法
    TestSwiftObject *swiftObj = [[TestSwiftObject alloc] init];
    result = [swiftObj login2WithName:@"jin" age:18];
    NSLog(@"%@",result);
    
    //-------------字段
    
    NSLog(@"静态常量字段:%@",TestSwiftObject.staticLet);
    NSLog(@"常量:%@",swiftObj.let1);
    NSLog(@"变量:%@",swiftObj.var1);
    
    //-------------计算属性
    NSLog(@"静态计算属性:%@",TestSwiftObject.staticComputer);
    NSLog(@"计算属性:%@",swiftObj.computer);

    //-------------懒加载字段
    NSLog(@"懒加载:%@",swiftObj.lazyField);
    NSLog(@"懒加载:%@",swiftObj.lazyField);
    
}

@end
name jin age 16
name jin age 18
静态常量字段:这是静态常量
常量:这是常量
变量:这是变量
静态计算属性:这是静态的计算属性20
计算属性:这是计算属性30
TestSwiftObject lazyField 这里的逻辑只会执行一次
懒加载:这是懒加载字段240
懒加载:这是懒加载字段240

打印log(CSDN又犯病了,无法上传图片,只能贴出log文本)可以看到能正常调用,像Swift中的枚举,结构体就不再演示了,目前是没法使用的,预计以后也不可能兼容。 

兼容性

不论是OC项目调用Swift,还是反过来都无法使用所有语法。如OC无法使用Swift的枚举、结构体。

性能影响

因为这种混合编程是官方提供的机制,同时OC,Swift都是原生语言,所以基本上没有性能影响。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sziitjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值