我想用 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++的互操作性。哇,Objective-C 和 Swift 都不能处理C++类及其语义。 因此,与尝试使用 C 中的C++时相比,您将面临相同的问题。在此和此答案中,您将找到有关C++互操作性的详细信息。
那么,从/到 Swift 调用什么更容易呢?确定 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 %dn", a);
printf ("Now calling Swift from C :n");
int z = mySwiftFunction(10);
printf ("Result returned in C:%dn", 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 %dn", a);
printf ("Now calling Swift from C :n");
int z = f(a);
printf ("Result returned in C:%dn", 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 )
使 swift 函数在 C 中可见的技巧@_silgen_name
在另一个 SO 答案中进行了解释,并记录在这里
您可以使用桥接头文件将用 Objective-C 编写的代码映射到 Swift 中使用。你不能使用 C/C++ 代码,因为 Xcode 本身只支持 Objective-C 和 Swift。在桥接头文件中,您必须导入Objective-C文件的头路径,您必须在Swift项目中导入该文件。