一、为什么写这篇文章

我们整个移动开发团队都在从老的语言向新的语言过度,Android团队所有项目都在使用Kotlin开发了,但是iOS团队还在使用OC开发项目。团队负责人也已经发话了,iOS端从下个新项目开始都要使用swift开发了,对于基本没怎么使用过swift的同学来说,马上用新语言开发项目还是有一定难度、有一定风险的。从OC和swift混编开始,从OC向swift逐渐熟悉过度,是最佳选择,积累的经验,降低了难度,也降低了风险!

二、Swift目前现状

苹果在WWDC2014正式发布Swift,目的是用于替代OC语言。在之后的时间里经历了标准库变动,语法的增减,特性变动,几乎每一年 Swift 都会迎来比较大的改动,甚至 API 都发生了变化,让很多第一批吃螃蟹的开发者苦不堪言,戏称《Swift 从入门到重学》。如今已是2020年了,经过 6 年多的不断迭代更新,WWDC2019苹果发布了Swift5.0,苹果终于宣布了Swift的稳定。这标志着Swift这门语言已经趋于稳定,语法已经不会再大变,已经有越来越多的个人和公司在使用Swift,现在也到了重拾Swift的时候了。

三、本篇文章主要内容

1、在OC工程中配置swift需要的基本环境

2、oc和swift页面相互跳转,oc和swift属性相互调用,oc和swift方法相互调用,oc和swift页面delegate相互传值,oc和swift页面block相互传值

1、环境的基本配置

1.1、新建一个基于OC的工程名为OcAndSwift,已经存在的OC工程也是一样的。

1.2、工程配置配置

新建一个OC类OCClass1ViewController

新建一个swift类SwiftClass1ViewController.swift

完整目录结构

2、实现 页面相互跳转返回,属性相互调用,方法相互调用,delegate传值,block传值

2.1、代码实现

ViewController.m

//
//  ViewController.m
//  OcAndSwift
//
//  Created by AiRongTang on 2020/9/29.
//  Copyright © 2020 AiRongTang. All rights reserved.
//
/**主界面*/
#import "ViewController.h"
#import "OcAndSwift-Swift.h"@interface ViewController ()<SwiftClass1ViewControllerDelegate>@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.title = @"主页";[self createButton];
}/// 创建按钮
-(void)createButton{//跳转按钮UIButton *butotn = [UIButton buttonWithType:UIButtonTypeSystem];[butotn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];butotn.frame = CGRectMake(0, 64, 150, 40);[butotn setTitle:@"跳转到swift1" forState:UIControlStateNormal];[butotn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];butotn.tag = 1;[self.view addSubview:butotn];//调用swift方法的按钮UIButton *ocCallButton = [UIButton buttonWithType:UIButtonTypeSystem];[ocCallButton addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];ocCallButton.frame = CGRectMake(0, 64+40+10, 150, 40);[ocCallButton setTitle:@"调用swift的方法" forState:UIControlStateNormal];[ocCallButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];ocCallButton.tag = 2;[self.view addSubview:ocCallButton];
}/// 按钮点击事件
/// @param sender 点击的按钮
-(void)buttonAction:(UIButton*)sender{SwiftClass1ViewController *class1 = [[SwiftClass1ViewController alloc]init];switch (sender.tag) {case 1:{//跳转到Swift界面class1.delegate = self;[self.navigationController pushViewController:class1 animated:YES];//实现swift类对象的block方法class1.myBlock = ^(NSString * _Nonnull data) {NSLog(@"myEidtorBlock==%@",data);};break;}case 2:{//调用swift的方法NSString *string = [class1 ocCallMethod:@"ocCallMethod成功"];NSLog(@"ocCallMethodReturn==%@",string);break;}default:break;}}/// 实现swift类对象的代理方法
/// @param data 接受数据
-(void)delegateMethod1:(NSString *)data{NSLog(@"delegateMethod1==%@",data);
}@end

SwiftClass1ViewController.swift

//
//  SwiftClass1ViewController.swift
//  OcAndSwift
//
//  Created by AiRongTang on 2020/9/29.
//  Copyright © 2020 AiRongTang. All rights reserved.
//
/**Swift界面*/
import UIKit//必须加上@objc 代理才能在oc类中可见。
@objc(SwiftClass1ViewControllerDelegate)
protocol SwiftClass1ViewControllerDelegate:NSObjectProtocol {func delegateMethod1(_ data: String);
}
//必须加上@objcMembers SwiftClass1ViewController中的属性才能在oc类中可见。
@objcMembers
class SwiftClass1ViewController: UIViewController, OCClass1ViewControllerDelegate {//定义delegatevar delegate:SwiftClass1ViewControllerDelegate?//定义Blocktypealias SwiftClass1ViewControllerBlock = (_ tttt:String) -> Voidvar myBlock:SwiftClass1ViewControllerBlock?;override func viewDidLoad() {super.viewDidLoad()// Do any additional setup after loading the view.self.title = "swift界面1";self.createButton()}/// 创建按钮func createButton(){//跳转按钮let btn = UIButton(frame: CGRect(x: 0, y: 100, width:150, height: 40))btn.setTitle("跳转到OC界面1", for: .normal);btn.setTitleColor(UIColor.red, for: .normal);btn.tag = 1;view.addSubview(btn);btn.addTarget(self, action: #selector(btnClicked), for: .touchUpInside);//调用OC方法的按钮let swiftCallButton = UIButton(frame: CGRect(x: 0, y: 100+40+10, width:150, height: 40))swiftCallButton.setTitle("调用OC的方法", for: .normal);swiftCallButton.setTitleColor(UIColor.red, for: .normal);swiftCallButton.tag = 2;view.addSubview(swiftCallButton);swiftCallButton.addTarget(self, action: #selector(btnClicked(button:)), for: .touchUpInside);//带数据返回按钮let returnButton = UIButton(frame: CGRect(x: 0, y: 100+40+40+10, width:150, height: 40))returnButton.setTitle("带数据返回", for: .normal);returnButton.setTitleColor(UIColor.red, for: .normal);returnButton.tag = 3;view.addSubview(returnButton);returnButton.addTarget(self, action: #selector(btnClicked(button:)), for: .touchUpInside);}/// 按钮点击事件/// - Parameter button: 点击的按钮@objc func btnClicked(button:UIButton){let vc = OCClass1ViewController();switch button.tag {case 1  ://跳转到OC界面vc.delegate = self;vc.selectConfirmBlock = {(data:String?)inprint("selectConfirmBlock==",data!);}self.navigationController?.pushViewController(vc, animated: true);case 2  ://调用OC的方法let string = vc.swiftCallMethod("swiftCallMethod成功");print("delegateMethod1==", string);case 3  ://调用delegate返回数据if delegate != nil {delegate?.delegateMethod1("我是从swift页面返回的delegate数据");}//调用block返回数据if (self.myBlock != nil){self.myBlock!("我是从swift页面返回的block数据");}self.navigationController?.popViewController(animated: true);default :print("默认case")}}/// 代理方法实现/// - Parameter data: 接受数据func delegateMethod1(_ data: String) {print("delegateMethod1==", data);}/// 供OC调用的方法/// - Parameter data: OC传过来的值/// - Returns: 返回值@objc func ocCallMethod(_ data: String) -> String {return data;}/*// MARK: - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigationoverride func prepare(for segue: UIStoryboardSegue, sender: Any?) {// Get the new view controller using segue.destination.// Pass the selected object to the new view controller.}*/}

OCClass1ViewController.h

//
//  OCClass1ViewController.h
//  OcAndSwift
//
//  Created by AiRongTang on 2020/9/29.
//  Copyright © 2020 AiRongTang. All rights reserved.
//
/**OC界面*/
#import <UIKit/UIKit.h>NS_ASSUME_NONNULL_BEGIN///Delegate
@protocol OCClass1ViewControllerDelegate <NSObject>-(void)delegateMethod1:(NSString *)data;@end///Block回调
typedef void(^SelectConfirmBlock)(NSString *data);@interface OCClass1ViewController : UIViewController@property (nonatomic, copy) SelectConfirmBlock selectConfirmBlock;@property (nonatomic, weak) id<OCClass1ViewControllerDelegate> delegate;/// 供swift调用的方法
/// @param data swift传过来的值
-(NSString *)swiftCallMethod:(NSString*)data;@endNS_ASSUME_NONNULL_END

OCClass1ViewController.m

//
//  OCClass1ViewController.m
//  OcAndSwift
//
//  Created by AiRongTang on 2020/9/29.
//  Copyright © 2020 AiRongTang. All rights reserved.
//
/**OC界面*/
#import "OCClass1ViewController.h"@interface OCClass1ViewController ()@end@implementation OCClass1ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.title = @"OC界面1";[self createButton];}/// 创建按钮
-(void)createButton{UIButton *butotn = [UIButton buttonWithType:UIButtonTypeSystem];[butotn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];butotn.frame = CGRectMake(0, 64, 150, 40);[butotn setTitle:@"带数据返回" forState:UIControlStateNormal];[butotn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];[self.view addSubview:butotn];
}/// 按钮点击事件
/// @param sender 点击的按钮
-(void)buttonAction:(UIButton*)sender{if (self.delegate && [self.delegate respondsToSelector:@selector(delegateMethod1:)]) {[self.delegate delegateMethod1:@"我是从OC页面返回的delegate数据"];}if (self.selectConfirmBlock) {self.selectConfirmBlock(@"我是从OC页面返回的block数据");}[self.navigationController popViewControllerAnimated:YES];
}/// 供swift调用的方法
/// @param data swift传过来的值
-(NSString *)swiftCallMethod:(NSString*)data{return data;
}/*#pragma mark - Navigation// In a storyboard-based application, you will often want to do a little preparation before navigation- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {// Get the new view controller using [segue destinationViewController].// Pass the selected object to the new view controller.}*/@end

2.2、操作结果打印

2.3、注意要点

//必须加上@objc 代理才能在oc类中可见。
@objc(SwiftClass1ViewControllerDelegate)
//必须加上@objcMembers SwiftClass1ViewController中的属性才能在oc类中可见。
@objcMembers

四、最后

希望大家能喜欢我分享的oc和swift混编这篇文章,希望它能为大家带来帮助。重点在于熟悉关键点的配置以及swift语法的使用。好的技术有很多,好的文章也有很多,只要我们善于总结,乐于分享,发扬人人为我,我为人人的观念,我们大家都会越来越好。

CSDN链接:https://blog.csdn.net/u011890139/article/details/108967123

demo链接:https://blog.csdn.net/u011890139/article/details/108967123

oc项目中使用swift相关推荐

  1. 在OC项目中添加Swift文件并实现混合编程

    对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有 ...

  2. iOS开发笔记之九十——在OC项目中支持Swift

    *****阅读完此文,大概需要5分钟****** 这个过程不复杂,但是有些问题遇到了可能就会捣弄很久,特此输出此文,希望可以帮助大家快速解决相应的问题. 一.配置步骤 1.主项目中添加工程名-Brid ...

  3. 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结

    将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...

  4. iOS 中 OC项目使用swift第三方工具(OC、swift 混合)

    OC项目引入swift, 1.建立 bridge 文件:在OC工程中新建swift文件,确认创建时,会提示建立 一个 项目名-bridging-header.h 文件. 2,建立 bridge 文件之 ...

  5. OC中调用Swift代码方法

    最近在项目中使用到了Swift语言写的第三方的框架,所以在这里将OC中使用Swift的方法说明一下. 1.首先要在Build Setting中进行相关配置 2.在Podfile文件中要加上use_fr ...

  6. swift项目调用OC代码,OC项目调用swift代码

    swift调用oc 在一个 Swift 开发的工程中可以通过两种方法来生成桥接文件. 第一种是,直接拖拽 OC 文件到工程中,此时系统会询问是否生成桥接文件,如图: 选择 "Create B ...

  7. 如何在OC类里 调用swift类

    一.OC调用swift文件 在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件 名字:工程名-Bridging-H ...

  8. Swift项目中不能定义OC类继承Swift类

    2019独角兽企业重金招聘Python工程师标准>>> 报错原因 Swift项目中 OC文件类  继承  Swift文件类 Cannot subclass a class with ...

  9. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

  10. IOS中的swift和oc关于对象模型的description方法重写

    IOS中的swift和oc关于对象模型的description方法重写 先讲OC的,oc比较重要,放在最前面. 首先创建一个cocoa Touch Class,继承NSObject, 命名Person ...

最新文章

  1. Worktile 进军软件开发与协作的初心与野心
  2. 别把个人信息“玩”丢了
  3. 非极大值抑制NMS的python实现
  4. Android 动画分析学习笔记
  5. vivo解bl锁_黔隆科技刷机教程酷派B770S忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  6. 计算机软考网络工程师历年真题,计算机软考《网络工程师》考试历年真题精选(1)...
  7. go 默认http版本_【每日一库】超赞的 Go 语言 INI 文件操作
  8. SpringCloud学习之网关gateway
  9. 【Cocos2d-X开发学习笔记】第05期:渲染框架之布景层类(CCLayer)的使用
  10. 可变字符串 插入,删除,替换,赋值
  11. FtpWebRequest(转)---关于C/S中文件的上传,下载,获得文件列表
  12. 如何提取Mac软件的自带图标?
  13. javascript的getElementByTagName
  14. NTSC、PAL、SECAM三大制式简介
  15. yum升级mysql_3分钟,YUM升级MYSQL,5.1到5.6
  16. 【python爬虫】每日获取强智教务系统课表,并发送短信到学生手机
  17. 用php计算身体质量指数,BMI计算器,身体质量指数BMI在线计算
  18. 【英语】英语写作——三段式开头
  19. 关于linux中socket阻塞与非阻塞
  20. 大数据之flink常用算子

热门文章

  1. taskmgr(任务管理器)无法出来的解决办法
  2. 123457123457#0#-----com.yuming.YiZhiFanPai01--前拼后广--益智早教游戏记忆翻牌cym
  3. 通过蚁剑,利用eval与assert,登录目标网站
  4. JS代码错误:Deleting local variable in strict mode
  5. 安卓真机如何连接本地服务器_Android真机连接本地服务器安装部署方法
  6. python猜字游戏
  7. 服务器如何挂网页游戏,网页游戏怎么挂云服务器
  8. 如果矩阵中存在字符用C语言,面试中常见的数据结构与算法题整理,想当架构师,数据结构与算法不过关可不行(数组+字符串,共60题)...
  9. Integer.MAX_VALUE是什么意思
  10. 用ping让对方电脑堵塞瘫痪