美文网首页
OC调用Swift framework

OC调用Swift framework

作者: hongzhenw | 来源:发表于2020-06-06 14:20 被阅读0次

    在此记录下OC如何调Swift framework!

    1. 新建工程OCCallSwift,语言选择OC,如图:


      image.png
    2. 新建lib_swift module,语言选择Swift,如图:


      image.png
    3. 新建测试对象TestMethod.swfit,如下:
    import Foundation
    
    public typealias complete = (_ v1:Int,_ v2:Int)-> Int
    
    public class TestMethod: NSObject {
        
        // 闭包表达式1
        @objc public var callback1:complete?
        // 闭包表达式2
        @objc public var callback2:((_ v1:Int,_ v2:Int)-> Int)?
        
        // 无参方法
        @objc public func test1() -> Void {
            print("test1 is run")
        }
        
        // 有参方法
        @objc public func test2(index:Int) -> Void {
            print("test2 is run \(index)")
        }
        
        // 尾随闭包方法
        @objc public func test3(a:Int,b:Int, callback:(Int)->Void) {
            return callback(a + b)
        }
        
        // 闭包方法1
        @objc public func test4() {
            guard let call = callback1 else {
                return
            }
            let result = call(2,3)
            print("callback1=\(result)")
        }
        
        // 闭包方法2
        @objc public func test5() {
            guard let call = callback2 else {
                return
            }
            let result = call(2,3)
            print("callback2=\(result)")
        }
    }
    

    注意事项:

    方法由于是提供给OC调用需添加@objc修饰,public为暴露给OC试用的方法

    1. 在ViewController.m中进行调用,如下:
    #import "ViewController.h"
    // 导库
    #import <lib_swift/lib_swift-Swift.h>
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        TestMethod *test = [[TestMethod alloc] init];
        [test test1];
        
        [test test2WithIndex:10];
        
        [test test3WithA:1 b:2 callback:^(NSInteger result) {
            NSLog(@"result=%ld",result);
        }];
        
        test.callback1 = ^NSInteger(NSInteger v1, NSInteger v2) {
            return v1 + v2;
        };
        [test test4];
        
        test.callback2 = ^NSInteger(NSInteger v1, NSInteger v2) {
            return v1 * v2;
        };
        [test test5];
    }
    
    @end
    

    运行结果如下:

    test1 is run
    test2 is run 10
    2020-06-05 16:56:57.269025+0800 OCCallSwift[14809:339123] result=3
    callback1=5
    callback2=6
    

    另外想要说的话:

    在看其它帖子说是需要修改工程defines mo为YES、product mo为当前工程名。我使用的是swift5,无论defines mo是设置YES或NO都不影响调用,product mo也没有修改,都不影响调用。猜测可能Xcode优化了???

    相关文章

      网友评论

          本文标题:OC调用Swift framework

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