IOS 05 OC和Swift混合编程

打印 上一主题 下一主题

主题 826|帖子 826|积分 2478

为什么需要使用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那里才能引用。
  1. //  目的是测试在OC中调用这个类的方法和字段
  2. //  一个Swift如果要在OC中使用,必须继承NSObject
  3. //  其他内容(方法,字段)如果要在OC中使用,前面必须加@objc
  4. //  注意:更改完代码,一定要要编译,OC那边才能引用
  5. //
  6. //  TestSwiftObject.swift
  7. //  OCUseSwiftTest
  8. //
  9. //  Created by jin on 2024/8/16.
  10. //
  11. import UIKit
  12. class TestSwiftObject: NSObject {
  13.    
  14.     @objc var var1 :String = "这是变量"
  15.    
  16.     @objc let let1 :String = "这是常量"
  17.    
  18.     @objc static let staticLet :String = "这是静态常量"
  19.    
  20.     /// 静态计算属性
  21.     @objc open class var staticComputer:String {
  22.         let result =  10*2
  23.         return "这是静态的计算属性\(result)"
  24.     }
  25.    
  26.     /// 计算属性
  27.     @objc open var computer:String{
  28.         get{
  29.             let result = 10*3
  30.             return "这是计算属性\(result)"
  31.         }
  32.     }
  33.    
  34.     /// 懒加载字段
  35.     @objc lazy var lazyField: String = {
  36.         let result = 20*12
  37.         print("TestSwiftObject lazyField 这里的逻辑只会执行一次")
  38.         return "这是懒加载字段\(result)"
  39.     }()
  40.    
  41.     /// 静态登录方法
  42.     @objc static func login(name:String, age :Int) -> String{
  43.         return "name \(name) age \(age)"
  44.     }
  45.    
  46.     /// 登录方法
  47.     @objc func login2(name:String, age :Int) -> String{
  48.         return "name \(name) age \(age)"
  49.     }
  50. }
复制代码
主动提示创建桥接文件

点击创建按钮

Defines Module,设置为Yes

选中项目文件 --> Build Setting --> 搜索Defines Module --> 设置为Yes
(CSDN又犯病了,无法上传图片,只能贴出步骤文本)
导入头文件

在要使用Swift类的OC的.m 文件中导入桥接文件的头文件
  1. //导入桥接文件
  2. #import "OCUseSwiftTest-Bridging-Header.h"
  3. //如果当前项目有Swift文件,需要在targets的Build Settings将Defines Module设置为YES
  4. //然后编译项目,就会自动生成该文件,这个文件在Xcode中看不到,但可以直接引用
  5. //引用以后,才能在当前文件使用当前项目的Swift源码里面的内容
  6. #import "OCUseSwiftTest-Swift.h"
复制代码
OC使用Swift类

  1. //
  2. //  ViewController.m
  3. //  OCUseSwiftTest
  4. //
  5. //  Created by jin on 2024/8/16.
  6. //
  7. #import "ViewController.h"
  8. //导入桥接文件
  9. #import "OCUseSwiftTest-Bridging-Header.h"
  10. #import "OCUseSwiftTest-Swift.h"
  11. @interface ViewController ()
  12. @end
  13. @implementation ViewController
  14. - (void)viewDidLoad {
  15.     [super viewDidLoad];
  16.     // Do any additional setup after loading the view.
  17.    
  18.     //-------------方法测试
  19.    
  20.     //调用Swift类中的静态方法
  21.     NSString *result = [TestSwiftObject loginWithName:@"jin" age:16];
  22.     NSLog(@"%@",result);
  23.    
  24.     //调用Swift类中的实例方法
  25.     TestSwiftObject *swiftObj = [[TestSwiftObject alloc] init];
  26.     result = [swiftObj login2WithName:@"jin" age:18];
  27.     NSLog(@"%@",result);
  28.    
  29.     //-------------字段
  30.    
  31.     NSLog(@"静态常量字段:%@",TestSwiftObject.staticLet);
  32.     NSLog(@"常量:%@",swiftObj.let1);
  33.     NSLog(@"变量:%@",swiftObj.var1);
  34.    
  35.     //-------------计算属性
  36.     NSLog(@"静态计算属性:%@",TestSwiftObject.staticComputer);
  37.     NSLog(@"计算属性:%@",swiftObj.computer);
  38.     //-------------懒加载字段
  39.     NSLog(@"懒加载:%@",swiftObj.lazyField);
  40.     NSLog(@"懒加载:%@",swiftObj.lazyField);
  41.    
  42. }
  43. @end
复制代码
  1. name jin age 16
  2. name jin age 18
  3. 静态常量字段:这是静态常量
  4. 常量:这是常量
  5. 变量:这是变量
  6. 静态计算属性:这是静态的计算属性20
  7. 计算属性:这是计算属性30
  8. TestSwiftObject lazyField 这里的逻辑只会执行一次
  9. 懒加载:这是懒加载字段240
  10. 懒加载:这是懒加载字段240
复制代码
打印log(CSDN又犯病了,无法上传图片,只能贴出log文本)可以看到能正常调用,像Swift中的枚举,布局体就不再演示了,目前是没法使用的,预计以后也不可能兼容。 
兼容性

不论是OC项目调用Swift,还是反过来都无法使用全部语法。如OC无法使用Swift的枚举、布局体。
性能影响

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表