Score
0
Watch 3 Star 5 Fork 0

rattan / OCBridgeSwiftToCallObjective-C

Create your Gitee Account
Explore and code with more than 5 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Without author's permission, this code is only for learning and cannot be used for other purposes.
OC与swift的数据传输 spread retract

Clone or download
README.md 9.08 KB
Copy Edit Web IDE Raw Blame History
rattan authored 2018-08-08 20:08 . 文案更新

OCBridgeSwiftToCall[OC与swift的数据传输]

##简介

该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知)

如果oc与swift之间的桥接有疑问请参考:oc与swift的相互调用

项目介绍

  • 1、swift之间的页面跳转与返回
  • 2、oc监听swift推送的通知
  • 3、swift内部推送接收的通知
  • 4、oc调用swift的代理方法
  • 5、swift调用oc代码块
  • 6、oc对swift的属性传值、方法调用、代码块调用
  • 7、swift对oc的属性传值、方法调用、代码块调用
  • 8、swift之间的传值

1、swift之间的页面跳转与返回

1、present方式跳转

 @objc func btnAction(_ sender:UIButton){
        let subVC  = SubVC();
        self.present(subVC, animated: true) {
            NSLog("👺👺👺:%@", subVC);
        };
        NSLog("👺👺👺:%@____%@",sender,self);
    }

2、返回

self.dismiss(animated: true) {
                NSLog("返回");
            };

2、oc监听swift推送的通知:

  • swift发送通知
 func postNotifition(){
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "通知方法");
    }
  • oc接收通知
-(void)addNotification{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiAction:) name:@"XMNotification" object:nil];
}

-(void)notiAction:(NSNotification *)sender{
    NSLog(@"oc:%@",sender.object);
}

-(void)removeNotification{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"XMNotification" object:nil];
}

3、swift内部推送接收的通知:

 func postNotifition(){
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "XMNotification"), object: "通知方法");
    }
    
    @objc func addNotification(){
        NotificationCenter.default.addObserver(self, selector: #selector(notificationAction(_:)), name: NSNotification.Name(rawValue: "XMNotification"), object: nil);
    }
    @objc func removeNotifition() {
        NotificationCenter.default.removeObserver(self);
    }
    
    @objc private func notificationAction(_ noti : Notification){
        let str:String = noti.object as! String;
        print("swift:" + str);
    }

通知打印结果

4、oc调用swift的代理方法:

  • 编辑协议方
///1、编辑协议
@objc(FourVCDelegate)
protocol FourVCDelegate {
    func backSuperVC(str:String)
}

///2、定义协议对象
@objc var myDelegate:FourVCDelegate?;

///3、调用协议
let str:String = "代理方法"
self.myDelegate?.backSuperVC(str: str);
  • 签署协议方
///1、调用协议
@interface FirVC ()<FourVCDelegate>

///2、签署协议
-(SecVC *)seVc{
    if (!_seVc) {
        _seVc = [SecVC new];
        _seVc.myDelegate = self;
    }
    return _seVc;
}

///3、协议实现
-(void)backSuperVCWithStr:(NSString *)str{
    NSLog(@"%@", str);
}

代理协议打印结果

###5、swift调用oc代码块

  • oc文件类
///代码块定义
@property(nonatomic,strong)void (^thiBlock)(NSString *str);

///代码块实现
!self.thiBlock?:self.thiBlock(@"swift调用oc代码块");
  • swift文件类

let vc  = ThiVC();
///代码块调用
vc.thiBlock = {(str) -> () in
    print("代码块方法");
}

self.present(vc, animated: true, completion: {

});

提示

###6、oc对swift的属性传值、方法调用、代码块调用

  • swift方法类
import UIKit

class FourVC: UIViewController {

    ///数组
    @objc var arr0:NSArray = NSArray()
    
    ///无参数无返回值
    @objc func swMethod0(){
        print("无参数无返回值");
    }
    ///有参数无返回值
    @objc func swMethod1(str: String)  {
        print("有参数无返回值:\(str)");
    }
    ///有参数有返回值
    @objc func swMethod2(str: String) -> (String){
        return "有参数有返回值:" + str;
    }

    /// mark - 代码块
    ///无返回参数
    @objc func bkBlock0(response:() -> ()){
        response();
    }
    ///返回一个字符串参数
    @objc func bkBlock1(response:(_ res : String) -> ()) {
        response("返回一个字符串参数");
    }
    ///返回多个任意类型参数
    @objc func bkBlock_2_(response:(_ res : Any,_ res1 : Any) -> ()) {
        response(self.arr0, "无参数,返回多个任意类型参数:");
    }
    ///传入多个参数 并返回多个任意类型的参数
    @objc func bkBlock3(p1:Any,p2:Any,p3:Any,res:(_ res0 : Any ,_ res1 : Any ,_ res2:Any,_ res3:Any) -> ()) {
        res("传入多个参数 并返回多个任意类型的参数:\n",p1, p2, p3);
    }
    ///Block带返回值
    @objc func bkBlock4(res:() -> ()) -> (String){
        res();
        return "Block带返回值"
    }
    
    
    //定义block
    typealias fucBlock = (_ backMsg : String?) ->()
    func bkBlock4(cmdStr:String?,blockProperty:fucBlock){
        blockProperty("backMsg---by block inside func")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.yellow;
        print("属性传值结果:",self.arr0[0],self.arr0[1],arr0[2]);
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.dismiss(animated: true) {

        };
    }
}
  • oc方法类:
    FourVC *vc = [FourVC new];
    // --- 属性传值 ---
    vc.arr0 = @[@"可以",@"可以",@"可以"];
    
    /// ------ 方法调用 -----
    
    //无参数无返回值
    [vc swMethod0];
    //有参数无返回值
    [vc swMethod1WithStr:@"dasda"];
    //有参数有返回值
    NSString *str = [vc swMethod2WithStr:@"sdfasda"];
    NSLog(@"%@",str);
    
    /// ------ 代码块调用 -----

    [vc bkBlock0WithResponse:^{
        NSLog(@"无返回数据代码块");
    }];
    
    //有一个返回值
    [vc bkBlock1WithResponse:^(NSString * str) {
        NSLog(@"%@", str);
    }];
    
    //有两个返回值
    [vc bkBlock_2_WithResponse:^(id str, id str1) {
        NSLog(@"%@\n%@",str1,str);
    }];
    
    //有参数有返回值
    [vc bkBlock3WithP1:@"ds" p2:@"dsa" p3:@"das" res:^(id p0,id p1, id p2, id p3) {
        NSLog(@"%@\n%@\n%@\n%@",p0,p1,p2,p3);
    }];
    
    [self presentViewController:vc animated:YES completion:^{
        
    }];

此处输入图片的描述

###7、swift对oc的属性传值、方法调用、代码块调用

  • xxx.h文件
@interface OcVC : UIViewController
///代码块
@property(nonatomic,strong)void (^clickBlock)(void);
///字符串
@property(nonatomic,copy)NSString *titStr;
///方法
-(void)testAction;
@end
  • xxx.m文件
- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",self.titStr);
    !self.clickBlock?:self.clickBlock();
}

-(void)testAction{
    NSLog(@"调用方法");
}
  • xxx.swift文件

let sub  = OcVC();
//属性传值
sub.titStr = "属性传值";
//方法调用
sub.testAction();
            
//代码块调用
sub.clickBlock = { () -> () in
     print("不带参数代码块")
};
     
sub.clickBlock();
self.present(sub, animated: true, completion: {
                
});

打印结果

###8、swift之间的传值

    func jumpToNextVC(){
        ///mark - =============
        let foVC =  FourVC()
        
        let dic:NSDictionary = ["key":1,"key1":2];
        let arr0:NSMutableArray = ["你好","好不好"];
        
        // mark -  属性传值
        foVC.arr0 = arr0;
        
        //方法调用
        foVC.swMethod0();
        foVC.swMethod1(str: "da");
        let str = foVC.swMethod2(str: "ddd");
        print(str);
        
        // mark -  代码块回调
        foVC.bkBlock0 {
            print("你可以的");
        };
        foVC.bkBlock1 { (res) in
            print(res);
        }
        foVC.bkBlock_2_{ (res, str) in
            print(res, "+", str);
        }
        foVC.bkBlock3(p1: "1", p2: "2", p3: "3") { (res0, res1, res2, res3) in
            print(res0,res1,res2,res3);
        }
        self.present(foVC, animated: true) {
            
        };
    }

Comment ( 0 )

Sign in for post a comment

Objective-C
1
https://gitee.com/chenzm_186/OCBridgeSwiftToCall.git
git@gitee.com:chenzm_186/OCBridgeSwiftToCall.git
chenzm_186
OCBridgeSwiftToCall
OCBridgeSwiftToCall
master

Search