IOS 05 OC和Swift混合编程

news2024/12/23 3:56:43

为什么需要使用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都是原生语言,所以基本上没有性能影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统】二、进程管理:1.进程与线程(程序、进程(PCB、状态转换、原语、进程间通信)、线程(多线程模型))

二、进程与线程 文章目录 二、进程与线程1.程序1.1顺序执行的特征1.2并发执行的特征 2.进程Process2.1定义(组织)2.1.1程序段2.1.2数据段2.1.3进程控制块PCB1)内容2)作用3)进程组织方式 2.2特征2.3进程的状态与转换2.3…

云服务器是什么?云服务器可以用来干什么?

云服务器,顾名思义,是指运行在云计算环境中的虚拟服务器。与传统的物理服务器相比,云服务器不需要用户自行购买、搭建和维护硬件设备,而是通过互联网从云服务提供商处获取计算资源、存储空间和网络服务。用户可以根据自己的需求&a…

spring揭秘05-ApplicationContext

文章目录 【README】【1】ApplicationContext概述【1.1】spring通过Resource对文件抽象【1.2】统一资源加载策略-ResourceLoader【1.2.1】 DefaultResourceLoader【1.2.2】FileSystemResourceLoader【1.2.3】 ResourcePatternResolver批量加载资源【1.2.4】Resource与ResourceL…

使用住宅代理抓取奥运奖牌新闻,全面掌握赛事精彩瞬间

引言 什么是新闻抓取?目的是什么? 新闻抓取有哪些好处? 为什么需要关注奥运奖牌新闻? 如何进行新闻抓取——以Google 新闻为例 总结 引言 近日,巴黎奥运会圆满落幕,在这16天中,全球顶尖运…

一问讲透什么是 RAG,为什么需要 RAG?

一. 为什么要用 RAG ? 如果使用 pretrain 好的 LLM 模型,应用在你个人的情境中,势必会有些词不达意的地方,例如问 LLM 你个人的信息,那么它会无法回答;这种情况在企业内部也是一样,例如使用 LLM 来回答企业…

VTK—vtkRectilinearGrid学习

vtkRectilinearGrid理解为沿着坐标轴方向一系列规格的网格,但是网格间距可以不同。需要显式的提供各坐标轴的点数据。单元数据不用指定,会隐式生成。与前面提到的vtkStructuredGrid 类似,但是每个网格线都是直的。 1.给三个坐标分配点&#…

Golang基于DTM的分布式事务SAGA实战

SAGA介绍 SAGA是“长时间事务”运作效率的方法,大致思路是把一个大事务分解为可以交错运行的一系列子事务的集合。原本提出 SAGA 的目的,是为了避免大事务长时间锁定数据库的资源,后来才逐渐发展成将一个分布式环境中的大事务,分…

关于tresos Studio(EB)的MCAL配置之DIO

General Dio Development Error Detect开发者错误检测 Dio Flip Channel Api翻转通道电平接口Dio_FlipChannel是否启用 Dio Version Info Api决定Dio_GetVersionInfo接口是否启用,一般打开就行。 Dio Reverse Port Bits让端口的位(通道)进…

最新号卡推广单页源码/仿制手机卡流量卡号卡代理推广源码/简洁实用/带弹窗公告+后台管理

源码简介: 最新号卡推广单页源码,它是手机卡流量卡号卡代理推广源码量身打造的,不仅设计得简洁实用,而且还有炫酷的弹窗公告功能和强大的后台管理系统哦! 一款号卡推广单页源码,自己仿制来的,…

arcgis-坡度坡向分析

坡向的描述有定性和定量两种方式,定量是以东为0,顺时针递增,南为90,西为180,北为270等,范围在0~35959′59″之间。 定性描述有8方向法和4方向法. 8 方向为东、东南、南、西南、西、西北、北、东…

Linux安装jdk8,tomcat和mysql

目录 Linux安装jdk8 第一步:下载jdk8 第二步:把下载好的压缩包通过finalShell发送到linux虚拟机上 ​编辑 第三步:解压缩 第四步:配置环境变量 第五步:重新加载profile配置文件 第六步:检查是否安装成…

C++ -- 负载均衡式在线OJ (三)

文章目录 四、oj_server模块1. oj_server的功能路由2. 建立文件版的题库3. model模块4.controller模块5.judge模块(负载均衡)6.view模块整体代码结构(前端的东西,不是重点) 五、最终效果项目源码 前面部分请看这里C –…

Unite Shanghai 2024 团结引擎专场 | 团结引擎实时全局光照

在 2024 年 7 月 24 日的 Unite Shanghai 2024 团结引擎专场演讲中,Unity 中国高级技术经理周赫带大家深入解析了团结引擎的实时全局光照系统。该系统支持完全动态的场景、动态材质和动态灯光的 GI 渲染,包括无限次弹射的漫反射和镜面反射 GI。 周赫&…

2024年职场常备!3款高效数据恢复软件免费版,让打工人工作无忧

嘿,职场的朋友们!咱们现在工作,数据就跟空气一样重要,对吧?但有时候,手一滑,文件没了,硬盘突然就挂了,系统也闹点小情绪,那心情,比股市大跌还难受…

基于Django的boss直聘数据分析可视化系统的设计与实现

研究背景 随着互联网的发展,在线招聘平台逐渐成为求职者与企业之间的重要桥梁。Boss直聘作为国内领先的招聘平台,以其独特的直聊模式和高效的匹配算法,吸引了大量的用户。然而,随着平台用户的增长,海量的招聘数据带来…

基于Faster-RCNN的停车场空位检测,支持图像和视频检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示: 基于Faster-RCNN的停车场空位检测系统,支持图像检测和视频检测(pytorch框架)_哔哩哔哩_bilibili (一)简介 基于Faster-RCNN的停车场空位检测系统是在pytorch框架下实现的,这是一个…

YB5214B 同步开关型降压锂电池充电管理芯片

概述: 是一款支持 4.5-16V 输入电压范围,最大输出为 2A 电流的同步降压锂电池充电管理芯片。芯片内部集成了低阻功率 MOSFETS,采用 500kHz的开关频率以实现较小的元件尺寸和较高的充电效率。 内部还集成了多重保护功能,能够最大程…

基于NXP IMX6Q+FPGA全自动血液分析仪解决方案

全自动血细胞分析仪 ,临床又称血常规检测仪、血液分析仪、血球分析仪、血液细胞分析仪、血球计数仪,是指对一定体积全血内血细胞异质性进行自动分析的临床检验常规仪器。 NXP IMX6Q核心板采用四核Cortex-A9架构,主频1GHz,12层PCB…

知识竞赛中风险题环节竞赛规则有哪些设计方案

风险题环节是知识竞赛活动中一个高潮环节,很多时候都是放到最后压轴,选手会根据之前的成绩进行最后一博。那么,常用的风险题环节规则应怎么设计呢?下面列出的这些大家可以参考一下。 1.设置不同分值的题,由选手根据自…

CSS——字体背景(Font Background)

一、字体族 1、字体的相关样式: ① color 用来设置字体颜色(前景颜色) ② font-size 字体的大小 和font-size相关的单位: em 相对于当前元素的一个font-size rem 相对于根元素的一个font-size ③ font-family 字体族&#x…