c++ - 如何将 Swift 与 C 或 C++ 接口?
问题描述
我想用 C 或 C++ 编写一些本机代码,以便在 iOS 上与 Swift 一起使用。这段代码主要从 Swift 调用,但也需要回调到 Swift。
将 Swift 与这两种语言中的每一种进行交互的机制是什么?
C 或 C++ 中的哪一个在这种接口中的约束最少,为什么?跨语言调用是否存在性能差异?
解决方案
swift与 C 或 C++的互操作性通过桥接头超越了 Objective-C 。
在这个 Objective-C 标头中,您可以包含 C 标头,因为 Objective-C 可以与 C 互操作。这样,Swift 不仅可以使用C 函数,还可以使用 C结构和联合。
您还可以使用 Objective-C++ 与 C++ 进行互操作性。Wowever,Objective-C 和 Swift 都不能使用 C++ 类及其语义。因此,您将面临与尝试从 C 中使用 C++ 时相同的问题。在此答案和此答案中,您将找到有关 C++ 互操作性的更多信息。
那么从 Swift 调用/向 Swift 调用什么更容易呢?绝对C
一步一步的小演示:
1)在 XCode 中创建一个 Swift 项目
2)添加 ac 文件test.c
3)当你添加了 c 文件后,XCode 会询问你是否要创建一个桥接头:只需确认。
4)使用以下代码
在桥接头中(或在桥接头中包含的标头中):
// C functions
int myCFunction(int a);
void myCFunctionWithCallback(int a, int (*f)(int));
// Swift functions accessible from C
extern int mySwiftFunction(int x);
示例test.c
文件:
#include <stdio.h>
// simple example with a hardcoded swift callback
int myCFunction(int a)
{
printf ("myCFunction in C called with %d\n", a);
printf ("Now calling Swift from C :\n");
int z = mySwiftFunction(10);
printf ("Result returned in C:%d\n", z);
return 2*a;
}
// example with a function pointer to a swift callback
void myCFunctionWithCallback(int a, int (*f)(int))
{
printf ("myCFunctionWithCallback in C called with %d\n", a);
printf ("Now calling Swift from C :\n");
int z = f(a);
printf ("Result returned in C:%d\n", z);
}
示例main.swift
文件:
import Foundation
@_silgen_name("mySwiftFunction") // vital for the function being visible from C
func mySwiftFunction(x: Int) -> Int
{
print ("mySwiftFUnction called in Swift with \(x)")
return 3*x
}
func mySwiftCallback(x: Int32) -> Int32
{
print ("mySwiftCallback called in Swift with \(x)")
return 7*x
}
print("Starting Swift/C interoperability demo !")
let a = myCFunction(12);
print ("returned result in Swift is \(a)")
print ("Now test with a callback function pointer:")
myCFunctionWithCallback(13, mySwiftCallback )
@_silgen_name
使 swift 函数在 C 中可见的技巧在这个其他 SO 答案中进行了解释,并在此处记录
推荐阅读
- xamarin - 如何用 UWP xamarin 表单中的其他图标替换汉堡包图标
- json - 如何在 ReadTheDocs 上将 doson 小部件与 Sphinx 一起使用
- angular - Rxjs 订阅多次触发
- windows - 在 PyQt 上声明列表时出现未知的语法错误
- javascript - 带有 PHP 的子表的 Javascript 格式函数
- javascript - 有没有办法简化 React.js 中状态内的一长串代码
- android - Fabric Debug Craslytic 报告:注册,缺少构建 ID,应用插件:io.fabric
- db2 - DB2 将增量备份表空间恢复到不同的数据库
- java - 是否可以在不初始化 Spring 上下文的情况下创建 Spring Data 自动实现的存储库?
- mysql - SQL选择2表中另一个日期的最接近的较小日期