跨语言调用

一、Objective-C

OC调用Swift:

创建桥接文件

使用@objcMembers修饰的swift类可以被OC使用

复制代码
@objcMembers class SwiftExample: NSObject {
    
    @objc func OC_Call_Swift() {
        print("oc call swift")
    }
    
    @objc static func OC_Call_Swift_static() {
        print("oc call swift static")
    }
    
    @objc class func OC_Call_Swift_class() {
        print("oc call swift class")
    }
    
}

OC部分

复制代码
#import "OCExample.h"
#import "Runner-Swift.h"

@implementation OCExample

- (void)OC_Call_Swift {
    SwiftExample *swiftExample = [[SwiftExample alloc] init];
    [swiftExample OC_Call_Swift];
    [SwiftExample OC_Call_Swift_static];
    [SwiftExample OC_Call_Swift_class];
}


@end
OC调用C和C++:

不需要桥接,可以直接调用

复制代码
#ifndef CExample_h
#define CExample_h

#include <stdio.h>

void OC_Call_C(void);

#endif /* CExample_h */

#include "CExample.h"

void OC_Call_C(void) {
    printf("oc call c");
}

#ifndef C_Example_hpp
#define C_Example_hpp

#include <stdio.h>

void OC_Call_C_(void);

#endif /* C_Example_hpp */

#include "C#Example.hpp"

void OC_Call_C_(void) {
    printf("oc call c#");
}

#import "OCExample.h"
#import "CExample.h"
#import "C#Example.hpp"

@implementation OCExample

- (void)OC_Call_C {
    OC_Call_C();
}

- (void)OC_Call_C_ {
    OC_Call_C_();
}

@end

二、Swift

Swift调用OC
复制代码
@interface OCExample : NSObject

+ (void)Swift_Call_OC_class;
- (void)Swift_Call_OC;

@end

#import "OCExample.h"

@implementation OCExample

+ (void)Swift_Call_OC_class {
    NSLog(@"swift call oc class");
}

- (void)Swift_Call_OC {
    NSLog(@"swift call oc");
}


@end

桥接文件中导入

复制代码
#import "OCExample.h"

在Swift代码中

复制代码
import Foundation

class SwiftExample {
    
    func Swift_Call_OC() {
        OCExample.swift_Call_OC_class();
        OCExample().swift_Call_OC();
    }
    
}
Swift调用C和C++

Swift不能直接调用C++代码,可以直接调用C代码,首先在桥接文件中导入

复制代码
#include "CExample.h"

#ifndef CExample_h
#define CExample_h

#include <stdio.h>

void Swift_Call_C(void);

#endif

#include "CExample.h"

void Swift_Call_C(void) {
    printf("swift call c");
}

class SwiftExample {
    
    func S_Swift_Call_C() {
        Swift_Call_C()
    }
    
}

如果使用C和C++去调用是将Swift函数使用闭包接收,然后在桥接文件中extern,然后就可以在C和C++中调用;

若要使用C和C++去调用需要在.mm文件中使用对应的方法包装,不能够直接调用。

注:本文不考虑有使用第三方库的方法,所以未包含与JS、Dart等互相调用的情况,后续会持续更新。

相关推荐
小羊没烦恼!8 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
昂好的day9 小时前
VisionMaster 通信模块实战(上):Modbus、TCP 收发、协议组装解析
开发语言·网络·网络协议·tcp/ip·c#
努力实干10 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
波力海苔夹心脆67512 小时前
C# 正则表达式零基础入门:从“看得懂“到“会用“
经验分享·后端·mysql·正则表达式·c#
老李IT笔记13 小时前
关掉设备上的 AI 扩展:两个键各管一层,配错了等于没配
人工智能·ios·智能手机
2501_9159214313 小时前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
android·ios·小程序·https·uni-app·iphone·webview
syagain_zsx13 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克60514 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
昂好的day14 小时前
VisionMaster(VM) 标定工具详解(上):为什么必须标定 + 九点标定手眼标定
开发语言·数码相机·c#
小小、码农15 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++