27.Swift学习之与OC混编
时间:2022-06-16
本文章向大家介绍27.Swift学习之与OC混编,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在目前iOS开发语言从Objective-C到Swift的过渡时期,开发中难免会碰到两种语言同时存在的情况,如果在同一个项目中,两种语言并存,那么该项目就是一个混合项目。在混合项目中,就会存在语言相互调用的情况,那么一个是上世纪的“老人”,一个是初出茅庐的“少年”,它们的沟通是存在障碍的,如何才能在一个项目中让两种语言可以相互调用呢?Apple给我们做好了“桥接”工作,但是在Objective-C的项目中调用Swift与在Swift项目中调用Objective-C,处理的方式是不一样的,下面来进行一个简单的介绍。
一、Objective-C的项目中调用Swift
- 新建一个Objective-C的iOS项目
- 创建一个Swift的类,继承自NSObject,这时候会有如下的提示,此时选择
Create Bridging Header
混合项目提示信息.png
这短话的大意:添加这个文件会创建一个Objective-C和Swift的混合项目,你是否希望Xcode自动配置一个桥接头文件来让两种语言的类文件相互可见?
- 此时项目中会多出两个文件,分别是创建的Swift文件和Bridging Header文件,Bridging Header文件里面虽然什么都没有,但是已经帮我们做了很多事情。Swift文件如下:
class Person: NSObject {
}
- 在Objective-C的类中导入头文件,注意此时导入的头文件是一个命名为
项目名-Swift.h
的头文件,而不是Bridging Header文件,该头文件是自动生成的并且对开发者透明 - 在Swift代码中将需要暴露给OC调用的属性和方法前加上
@objc
修饰符,关于这个内容可查看之前的博文
class Person: NSObject {
@objc func eat(){
print("吃饭了")
}
}
- 最后直接在OC代码中调用Swift
#import "ViewController.h"
#import "AA-Swift.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc]init];
[person eat];
}
@end
二、Swift项目中调用Objective-C
- 新建一个Swift的iOS项目
- 创建一个Objective-C的类,此时也会有如一中的文字提示,修改类文件如下:
@interface Person : NSObject
-(void)eat;
@end
@implementation Person
-(void)eat{
NSLog(@"吃饭了");
}
@end
- 在Bridging Header文件中导入所有的需要使用的Objective-C类的头文件,如图所示:
Bridging Header文件导入类.png
- 直接在Swift文件中使用Objective-C里面定义的内容
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let person = Person()
person.eat()
}
}
关于Bridging Header文件
如果Bridging Header文件不是Xcode帮助新建的,而是自己新建的头文件,那么会因为找不到“桥接文件”而编译失败,此时需要在 building setting
里搜索bridging
关键字,将文件的路径值改成实际文件的路径即可。
- 1.Linux操作系统安装的5种方法以及心得
- 我(作为一名开发者)所犯过的错误
- Hadoop-2.7.4 集群快速搭建
- Scala-2.13.0 安装及配置
- HBase-1.3.1 集群搭建
- CentOs7.3 Hadoop 用户 ssh 免密登录
- 手把手教你用Mysql-Cluster-7.5搭建数据库集群
- 简单的java开源图床
- 调度器Quartz的简述与使用总结
- 使用 RecyclerView 实现 Gallery 画廊效果,并控制 Item 停留位置
- linux chmod,chown命令详解
- Quartz任务调度快速入门
- ElasticSearch 安装报错整理
- Docker Compose 1.16.1 安装
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP与SQL语句写一句话木马总结
- golang实现php里的serialize()和unserialize()序列和反序列办法详解
- php和html的区别点详细总结
- 详解在YII2框架中使用UEditor编辑器发布文章
- 在Laravel的Model层做数据缓存的实现
- Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
- php连接mysql数据库最简单的实现方法
- 解决laravel id非自增 模型取回为0 的问题
- PHP7.0连接DB操作实例分析【基于mysqli】
- Laravel获取当前请求的控制器和方法以及中间件的例子
- laravel中数据显示方法(默认值和下拉option默认选中)
- laravel请求参数校验方法
- ThinkPHP 5.x远程命令执行漏洞复现
- 关于php开启错误提示的总结
- php创建类并调用的实例方法