我想用C或C++编写一些本机代码,以便与iOS上的Swift一起使用。这段代码主要是从Swift调用的,但也需要回调到Swift。
Swift与这两种语言的接口机制是什么?
在这种接口中,哪个C或C++的约束最小?为什么?跨语言呼叫有什么性能差异吗?
发布于 2019-04-28 12:45:25
带有C或C++的C++通过桥接头越过目标C。
在这个目标- C头中,您可能包括C头,因为Objective与C是可互操作的。Swift不仅可以与C函数一起工作,而且还可以使用C 结构与结合。
您还可以使用Objective++使用与C++的互操作性。但是,Objective和Swift都不能处理C++类及其语义。因此,与使用C.中的C++时相比,您将面临同样的问题,在这和这答案中,您将发现更多关于C++互操作性的信息。
那么,从斯威夫特打电话给斯威夫特更容易吗?确定C
一步一步的演示
1)在XCode中创建Swift项目
2)添加c文件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 )发布于 2019-04-28 13:11:31
您可以使用桥接头文件来映射在Swift中使用的Objective编写的代码。您不能使用C/C++代码,因为Xcode本身只支持Objective和Swift。在桥接头文件中,您必须导入Objective文件的头路径,这是您必须在Swift项目中导入的。
https://stackoverflow.com/questions/55890187
复制相似问题