oc调用swift方法并传参_swift在一个oc方法里调用类方法怎么不会调用 - CSDN
  • OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章) 2.OC类里仅可以调用public的Swift...

    原创文章转载请注明出处。

    背景


    在上一篇文章swift与OC混编(创建混编工程)中简单讲述了怎么创建Swift和OC的混编工程。本篇讲一下Swift和OC的混编工程中的方法调用。

    OC调用Swift


    OC调用Swift方法比较简单。但是需要注意以下几点:

    • 1.需要在当前OC类里导入xxx-Swift.h头文件,其中xxx为项目名称(与你的项目配置相关,具体配置方式见上一篇文章)

    • 2.OC类里仅可以调用public的Swift方法和变量

    • 3.Swift类最好用@objc(xxx)进行描述

    暂时想到这几点,如有疏漏请留言指出,不胜感激。

    剩下的调用方式就和普通的OC之间调用方式类似了。

    OC调用Swift实例方法


    继续用上一篇文章的例子进行说明,例如在ViewController.m类里调用Swift的logMe实例方法,就可以这么写:

    SwiftDemo* demo = [[SwiftDemo alloc] init];
    [demo logMe];
    

    OC调用Swift静态方法


    首先先在SwiftDemo.swift文件中声明一个静态方法:

    public static func swiftStaticFunc(log: NSString) {
        print(log);
    }
    

    然后回到ViewController.m类里调用该方法(记得编译一下才可以吆~)

    桐乡的,调用方式和OC之间的调用类似:

    [SwiftDemo swiftStaticFunc:@"oc call swift static func"];
    

    Swift调用OC


    前一篇文中也已经说过需要有一个桥接文件Swift才可以调用OC相关方法以及属性等,这里不再赘述,忘记了的可以再回去看一下。

    Swift调用OC实例方法


    其实前面文中已经举例说明了调用方法。这里再简单重复一下。

    在SwiftDemo.swift类里调用ViewController.m类里的logYou方法,swift调用代码如下:

    let vc = ViewController()
    vc.logYou()
    

    声明一个变量vc,也就是ViewController的实例对象。然后用vc对象调用实例方法logYou。

    Swift调用OC多参方法


    首先先在ViewController.h中声明一个OC的多参方法:

    - (void) logMe:(NSString*)logMe logYou:(NSString*)logYou;
    

    在.m文件中进行一下实现:

    - (void)logMe:(NSString *)logMe logYou:(NSString *)logYou {
        NSLog(@"%@--%@", logMe, logYou);
    }
    

    在SwiftDemo.swift文件中调用方法如下:

    vc.logMe("log me", logYou: "log you")
    

    方法从第一个参数开始都要写在括号里。

    Swift调用OC静态方法


    首先先在ViewController.h中声明一个OC的静态方法:

    + (void) ocStaticFunc:(NSString*)log;
    

    然后在.m文件中简单些一下实现:

    + (void)ocStaticFunc:(NSString *)log {
        NSLog(@"%@", log);
    }
    

    回到SwiftDemo.swift文件中,用swift调用OC的静态方法。

    ViewController.ocStaticFunc("swift call oc static func")
    

    Swift调用OC变参方法


    在某些需求情景下,需要用到变参函数。简单举个例子:

    + (void) stringParams:(NSString*)params,...;
    

    这种例子在系统函数中也可以见到。比如常用的NSString的一个方法:

    - (instancetype)initWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
    

    OC的调用方法就不再重复了。这里说一下Swift怎么调用OC的变参方法。

    首先,Swift不能直接调用OC的变参方法

    如果必须要用到,则需要对函数进行简单修改。

    拿上面刚说到的stringParams:方法举例。

    需要把方法的写法改为:

    + (void) stringParams:(NSString*)params args:(va_list)args;
    

    函数的具体实现:

    + (void) stringParams:(NSString *)params args:(va_list)args {
    
        va_list args_copy;
    
        __va_copy(args_copy,args);
        NSMutableString* format = [NSMutableString stringWithString:@""];
        while (va_arg(args, NSString*))
        {
            [format appendString:@"%@,"];
        }
        va_end(args);
    
        if(format.length>0)
            [format deleteCharactersInRange:NSMakeRange(format.length-1,1)];
    
        NSString* newFormat = [NSString stringWithFormat:@"%@",format];
        NSString * result = [[NSString alloc]initWithFormat:newFormat arguments:args_copy];
        va_end(args_copy);
        NSLog(@"%@", result);
    }
    

    在Swift中的调用方式:

    let args: [CVarArgType] = ["i'm", " showhilllee"]
        withVaList(args) {
            (pointer: CVaListPointer) in
            return ViewController.stringParams("%@,%@", args:pointer)
        }
    

    当然,还有其他方式来实现。可以尝试找一下方法。

    结语


    本文Demo可以在【这里】下载到

    —End—

    展开全文
  • @OC调用Swift 方法 OC调用传多值参数Swift方法的处理 截止目前, Swift 已经达到4.2版本。有很多优秀的Swift库。有时需要OC和Swift混编。学习研究了一下FaceAware 人脸感知开源库。 Swift方法传多值参数及OC调用 ...

    OC调用传多值参数Swift方法的处理

    截止目前, Swift 已经达到4.2版本。有很多优秀的Swift库。有时需要OC和Swift混编。例如 FaceAware 人脸感知开源库。

    Swift方法传多值参数及OC调用

    比如一个开源的图片处理框架,人脸感知库FaceAware
    FaceAware GitHub 地址页面,在Swift 内部可以这样设置一个已知Image和Frame的方法,即多值参数。

        func setLocalFaceImageAndFrame(aImage: UIImage?, aFrame: CGRect?) {
            let layer = self.imageLayer()
            layer.contents = aImage!.cgImage
            layer.frame = aFrame!
        }
    

    OC与Swift混编,在"ProjectName_iOS-Swift.h"的头文件中,并没有暴露出上述所写方法,若加上 @objc ,会报错

    Method cannot be marked @objc because the type of the parameter 2 cannot be represented in Objective-C
    

    不能运行。故调整如下:

    把多值参数封装成一个Dictionary,通过Dictionary传值处理。

        @objc
        public func setLocalFaceImageAndFrame(infoDic: NSDictionary) {
            let aImage = infoDic["image"] as! UIImage
            let aFrame = infoDic["frame"]
            
            let layer = self.imageLayer()
            layer.contents = aImage.cgImage
            layer.frame = aFrame as! CGRect
        }
    

    附加:
    FaceAware https://github.com/BeauNouvelle/FaceAware

    展开全文
  • 该项目主要介绍了oc与swift之间、swift内部几种常见的传值方式(属性传值、代码块传值、代理传值、通知) 如果oc与swift之间的桥接有疑问请参考:OC与swift桥接互调 项目介绍 ... 4、oc调用s...

    该项目主要介绍了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) {
    
            };
        }

    原文地址:https://blog.csdn.net/weixin_38633659/article/details/81569207

    展开全文
  • OCswift混编中的相互跳转和传值

    前段时间在开发项目中遇到了OC和swift混编的情况,下面就相互跳转和传值分享一下自己的经验:


    1.OC----> swift

    首先要在OC中引用swift头文件,写法是 #import "(项目名)-swift.h"

    跳转:

    swiftClearViewController *VC = [[swiftClearViewController alloc]init];

    [self.navigationController pushViewController:VC animated:YES];

    当需要传值时首先要在swift中定义变量

    然后就可以正常的进行传值了


    2.swift---->OC

    还是要引用头文件,这里的方法是创建桥接头文件,具体方法不再赘述

    跳转和传值和上面类似


    展开全文
  • 随着Swift的日益完善,终究会取代OC的地位,就像Kotlin取代Java一样,不是时间的问题,而是使用者愿意不愿意被时代淘汰的问题首先是Swift中定义闭包

    随着Swift的日益完善,终究会取代OC的地位,就像Kotlin取代Java一样,不是时间的问题,而是使用者愿意不愿意被时代淘汰的问题

    首先是Swift中定义闭包

    一定要注意在Swift的类前面加上@objcMembers,这样才能在OC中引用;在引用的变量前面加上@objc

    @objcMembers class XuanzedituViewController: BaseViewController{
        typealias MapClosure = (Dictionary<String, Any>) -> Void
        @objc var blo:MapClosure?
    }
    //这样写就好了
    

    ###在OC中接着,按block那样的写

    XuanzedituViewController *xz = [[XuanzedituViewController alloc] init];
    xz.blo=^(NSDictionary<NSString *,id> *d){
        //To do something
    };
    [_c.navigationController pushViewController:xz animated:YES];
    

    就酱

    展开全文
  • JS-OC交互,相互传递参数,里面差不多都换成中文了
  • OC函数声明:(类方法/工厂方法关键字 ±)(返回类型) 方法名:标识符:传参 {代码} OC方法调用编写格式: [对象 方法] 示例: -(void)viewDidLoad {  [super viewDidLoad];  [self SaySomething:@...
  • OCSwift中的字符串

    2019-02-20 00:37:46
    一、OC中的字符串 引用类型在Object-C中,使用NSString和NSMutableString这两个类对字符串进行操作,一个字符串对象会被指针所引用。一般情况下,使用一个旧的字符串对象对一个新声明的字符串对象进行赋值,其实就是...
  • OC与JS互相调用并传值

    2018-01-19 11:39:43
    OC与JS间相互调用的几种方式#####第一种:使用JavaScriptCore,iOS7之后系统的原生方法,能够实现一些比较复杂的参数互传及参数返回。使用也比较简单,有以下几篇文章有比较详细的介绍。基本看完就能够熟练的使用了...
  • 基本操作就是在第二个页面定义一个闭包函数,然后在第一个页面将定义好的...// ViewController.swift // SwiftClosure // // Created by 程磊 on 16/4/15. // Copyright © 2016年 AA租车. All rights reserved. //im
  • 1.Swift调用ObjectiveC 1.1创建OC类 //testObject.h文件 #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @interface testObject : NSObject -(void)seyHello; @end NS_ASSUME_NONNULL_END ...
  • swift 调用 C语言库

    2016-06-15 18:54:57
    目前了解到两种调用C语法方法方式:这里以系统中自带的“/usr/include/CommonCrypto/CommonCrypto.h”为例 一: 使用桥接文件。  创建一个桥接文件xxx.h,然后在Build setting 中 “Objective-C Bridging Header...
  • Swift 的四种传值方式 有 单例, 代理,闭包(oc的block),通知. 1 单例 Swift 的单例简单到怀疑他的正确性.步骤如下:(下面有具体代码)  第一步 创建 SingleTest static let shareInstance = SingleTest()  第二步 ...
  • 1. 最简单的方法 拖拽, 这个就不用多解释了吧. 直接从一个视图控制器拖拽到另一个视图控制器, 选择 show, 就行了. 2. 利用 Segue 方法 (这里主要是 方法1 的传值) 连好线, 点击 连线中间部分, 设置 ...
  • 看了stanford大学的公开课视频,按照上面的范例敲了一遍,发现有错误 method"performOperation" with Objective-c selector"performOperation:"conflicts with previous declaration with the same Obejctive-c ...
  • 需求 原生的UIButton的点击事件唯一的参数就是UIButton本身,我们通常使用UIButton自带的tag来使用不同的参数,在简单的业务场景下,通过tag都是可以满足需求的,但是在某些业务复杂的情况下,tag显得有些无力了,...
  • 第一种 第二种方式swift写法
  • 转自:... // 正常调用  CLASSA *a = [[CLASSA alloc] init];  [a CallFunc];    // 反射调用  Class cls = NSClassFromString(@"CLASSA");  id a= [[cls al
  • 首先我们先创建两个视图控制器ViewController.swift和SubViewController.swift 设置第一个界面 首先在第一个界面创建好一个TextFeild,用来写我们要传的文字 import UIKit class ViewController: ...
  • 今天,工作的时候,遇到OC调用swift中代码的问题,特意上网查了查,现在自己总结如下: 以新建一个项目为例:OCAndSwift 1. 项目创建的时候,选择的时候Objective-C语言 2. 创建了一个SwiftUser.swift文件,内容...
1 2 3 4 5 ... 13
收藏数 252
精华内容 100
关键字:

oc调用swift方法并传参