Swift类与OC类方法相互调用的

作者: 斯文_7 | 来源:发表于2016-05-24 11:06 被阅读6154次

    收集整理,希望对大家有帮助
    1、OC调用Swift实例方法
    ==
    例如在ViewController.m类里调用Swift的logMe实例方法,就可以这么写:

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

    2、OC调用Swift静态方法

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

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

    然后回到ViewController.m类里调用该方法(记得编译一下才可以)同样、调用方式和OC之间的调用类似:

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

    3、Swift调用OC实例方法

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

    let vc = ViewController()
    vc.logYou()
    

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

    4、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")
    方法从第一个参数开始都要写在括号里。

    5、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 fun")
    ```
    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)
        }
    ```
    当然,还有其他方式来实现。可以尝试找一下方法。

    相关文章

      网友评论

      • dc9032a19231:那oc怎么调用class开头的方法呢?
      • Double丶K:-(instancetype)initWithFrame:(CGRect)frame andLineChartType:(JHLineChartType)lineChartType 这种怎么调用
        Double丶K:@乔克_叔叔 点initwith.....点不出来,还有结构体里面的属性oc中直接=就行swift中要怎么搞,多谢:kissing_heart:
        斯文_7:@KK先森 相当于调用多参
      • 数据斯基:技术贴,必须支持!
        斯文_7:@Rocky_Xin 大家 多多交流

      本文标题:Swift类与OC类方法相互调用的

      本文链接:https://www.haomeiwen.com/subject/qulzrttx.html