跨语言调用

news/2024/7/20 23:05:35 标签: ios, swift, c++, c#

一、Objective-C

OC调用Swift:

创建桥接文件
Runner/Runner-Bridging-Header.h
使用@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等互相调用的情况,后续会持续更新。


http://www.niftyadmin.cn/n/5300393.html

相关文章

深度生成模型之GAN优化目标设计与改进 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN优化目标设计与改进原始GAN优化目标的问题1. JS散度度量问题2. 梯度问题 优化目标的设计与改进1. 最小二乘损失GAN2. Energy-based GAN(EBGAN)3. Wasserstein GAN4. WGAN-GP5. Boundary Equilibrium GAN(BEGAN)6. Loss Sensitive GAN7. Relativeisti…

【设计模式-2】原型模式的原理、代码实现及类图展示

我们一定对类的实例化比较熟悉&#xff0c;前面我们说的单例、还有3种工厂模式都是通过new关键字来创建对象&#xff0c;下面我们来了解一种新的对象创建的方式。 1. 定义 原型模式也是一种创建型的设计模式&#xff0c;实现和原理总体比较简单&#xff0c;一句话总结呢&#…

认识SpringBoot项目中的Starter

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

由麦克斯韦方程组推出均匀平面电磁波及其特征

由麦克斯韦方程组推出均匀平面电磁波及其特征 均匀平面电磁波是指在传输方向垂直与传输方向垂直的平面上&#xff0c;电磁波的每一点的电场和磁场都相同&#xff0c;这种电磁波被称作均匀平面电磁波。 研究任何一种物理现象&#xff0c;当一种物理现象特别复杂的时候&#xf…

FFmpeg处理音视频的常用API及一般流程

FFmpeg是一个开源的音视频处理库&#xff0c;提供了丰富的API用于音视频的编解码、转码、过滤、播放等操作。 一、使用FFmpeg API解码涉及到的函数及一般流程如下&#xff1a; 1. av_register_all(): 注册所有的编解码器和格式。 av_register_all(); 2. avformat_open_inpu…

EBU7140 Security and Authentication(三)密钥管理;IP 层安全

B3 密钥管理 密钥分类&#xff1a; 按时长&#xff1a; short term&#xff1a;短期密钥&#xff0c;用于一次加密。long term&#xff1a;长期密钥&#xff0c;用于加密或者授权。 按服务类型&#xff1a; Authentication keys&#xff1a;公钥长期&#xff0c;私钥短期…

【Math】重要性采样 Importance sample推导【附带Python实现】

【Math】重要性采样 Importance sample推导【附带Python实现】 文章目录 【Math】重要性采样 Importance sample推导【附带Python实现】1. Why need importance sample?2. Derivation of Discrete Distribution3. Derivation of Continuous Distribution3. An Example 笔者在学…

关于Python里xlwings库对Excel表格的操作(二十四)

这篇小笔记主要记录如何【如何使用xlwings库中的“api”类设置单元格边界线型、粗细、颜色】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b;…