在 C/C++ 中使用 swift 库?
Use swift library in C / C++?
关于如何在 Swift 中使用 C/C++/Objective-C 代码的文档很多。在 Objective-C.
中也有关于使用 Swift 的信息
不过,我想知道:是否可以在 C 或 C++ 代码中使用 Swift 库?
您可以使用 Objective C 中的 swift 并且 Objective C 是 C 的严格超集。因此,如果您将 swift 函数包装在 Objective C 中,那么您可以从 C 调用它。请参阅此 thread 从 C 调用 ObjC。
简短回答:是的,可以通过将 Swift 代码包装在 Objective-C 代码中,以可从 C 调用的方式编写,正如@Josh Homann 已经建议的那样。
不过,这里有几点需要注意:
- 如果您要从中调用 Swift 的 C 代码是命令行的一部分
实用程序,您可能 运行 在加载 Swift 库时遇到问题
运行时间,见https://forums.developer.apple.com/thread/8213和
- 您不能在 C 代码中使用 Swift 特定的数据类型,因此
Objective-C 包装器必须完成所有数据类型转换。
话虽如此,这里是一个过于简单的小例子,仅供说明之用。假设我们有这个有价值的功能,只在 Swift 中可用,我们想在 C:
中使用
@objc public class SwiftClass : NSObject {
var myInt : Int32 = 111
@objc public func processInteger(_ anInt : Int32) -> Int32 {
myInt += anInt
print("About to return \(myInt) from Swift")
return myInt
}
}
Objective-C 包装器,在 .m
文件中,可能如下所示:
int32_t processIntegerOC(int32_t i) {
puts("Entered Objective-C wrapper, about to use Swift...");
SwiftClass * sc = [[SwiftClass alloc] init];
return [sc processInteger:i];
}
请注意,此函数可以从 C 调用,但因为它在 Objective-C 文件中,所以可以使用 Swift。该函数是从 C 代码调用的,就像任何其他 C 函数一样:
void processIntegerC(int32_t i) {
puts("Entered processIntegerC(), about to call Objective-C wrapper...");
int32_t retVal = processIntegerOC(i);
printf("processIntegerC() has integer %d\n", retVal);
}
关于如何在 Swift 中使用 C/C++/Objective-C 代码的文档很多。在 Objective-C.
中也有关于使用 Swift 的信息不过,我想知道:是否可以在 C 或 C++ 代码中使用 Swift 库?
您可以使用 Objective C 中的 swift 并且 Objective C 是 C 的严格超集。因此,如果您将 swift 函数包装在 Objective C 中,那么您可以从 C 调用它。请参阅此 thread 从 C 调用 ObjC。
简短回答:是的,可以通过将 Swift 代码包装在 Objective-C 代码中,以可从 C 调用的方式编写,正如@Josh Homann 已经建议的那样。
不过,这里有几点需要注意:
- 如果您要从中调用 Swift 的 C 代码是命令行的一部分
实用程序,您可能 运行 在加载 Swift 库时遇到问题
运行时间,见https://forums.developer.apple.com/thread/8213和
- 您不能在 C 代码中使用 Swift 特定的数据类型,因此 Objective-C 包装器必须完成所有数据类型转换。
话虽如此,这里是一个过于简单的小例子,仅供说明之用。假设我们有这个有价值的功能,只在 Swift 中可用,我们想在 C:
中使用@objc public class SwiftClass : NSObject {
var myInt : Int32 = 111
@objc public func processInteger(_ anInt : Int32) -> Int32 {
myInt += anInt
print("About to return \(myInt) from Swift")
return myInt
}
}
Objective-C 包装器,在 .m
文件中,可能如下所示:
int32_t processIntegerOC(int32_t i) {
puts("Entered Objective-C wrapper, about to use Swift...");
SwiftClass * sc = [[SwiftClass alloc] init];
return [sc processInteger:i];
}
请注意,此函数可以从 C 调用,但因为它在 Objective-C 文件中,所以可以使用 Swift。该函数是从 C 代码调用的,就像任何其他 C 函数一样:
void processIntegerC(int32_t i) {
puts("Entered processIntegerC(), about to call Objective-C wrapper...");
int32_t retVal = processIntegerOC(i);
printf("processIntegerC() has integer %d\n", retVal);
}