为什么 Swift 需要“了解”其他语言?
\n\n想象一下,您是一家高级餐厅的主厨。您有一把招牌刀(Swift)——锋利、符合人体工学、握感极佳。但是,要处理河豚鱼,您需要一把特殊的手术刀(C);而要制作完美的慕斯,则需要一台昂贵的搅拌机(Python)。您不会用主刀去剁鱼吧?编程也是如此:Swift 与其他语言的集成并非示弱,而是技艺的巅峰。
\n\nSwift 生态系统正在迅速发展,但它并非存在于真空中。机器学习库是用 Python 编写的,高性能解析器是用 C 编写的,而银行系统的遗留代码则是用 C++ 编写的。能够融合这些世界为开发者打开了无限可能。在本文中,我们将探讨三种关键场景:如何让 Swift 与 Python、C 和 C++ 协同工作。
\n\n1. Swift + Python:PythonKit 的魔力
\n\n苹果公司一贯的风格是让集成尽可能“Swift 化”。PythonKit 是一个框架,它允许您直接从 Swift 调用 Python 代码,就像调用原生函数一样。安装很简单:只需通过 Swift Package Manager 添加依赖项即可。
\n\n项目设置
\n\n在 Package.swift 中添加:
let package = Package(\n name: "MySwiftPythonApp",\n dependencies: [\n .package(url: "https://github.com/pvieito/PythonKit.git", branch: "master")\n ],\n targets: [\n .target(name: "MySwiftPythonApp", dependencies: ["PythonKit"])\n ]\n)\n\n示例:计算斐波那契数列
\n\n假设您有一个用于计算斐波那契数列的高度优化的 Python 脚本。何必用 Swift 重写它呢?直接调用即可。
\n\nPython 文件 (fib.py):
\ndef fib(n):\n a, b = 0, 1\n for _ in range(n):\n a, b = b, a + b\n return a\n\nSwift 代码:
\nimport PythonKit\n\n// 1. 加载模块(不带 .py)\nlet fibModule = try Python.attemptImport("fib")\n\n// 2. 调用函数\nlet result = fibModule.fib(10)\nprint("第10个斐波那契数:", result) // 输出:55\n\n// 3. 使用 numpy(如果已安装)\nlet np = Python.import("numpy")\nlet array = np.array([1, 2, 3, 4])\nprint(array * 2) // 输出:[2 4 6 8]\n\n请注意:Python.attemptImport 是一个安全的封装。如果找不到模块,您会收到错误,而不会导致应用崩溃。通过 PythonKit 实现的 Swift 与 Python 集成 在 macOS 和 Linux(需安装 Python 3.x)上均可运行。
何时需要这样做?
\n- \n
- 您需要 Swift 中没有的库(例如
pandas或scikit-learn)。 \n - 您正在使用 Vapor 编写服务器端应用,并希望将 Python 用于 ETL 流程。 \n
- 您在 Python 中原型设计 ML 模型,然后将其嵌入到 iOS 应用中。 \n
2. Swift + C:与“硬件”直接对话
\n\nC 是一种传奇语言。操作系统内核、驱动程序以及 Unix 世界的一半都是用 C 编写的。Swift 的设计目标是使 与 C 的互操作性 尽可能无缝。您可以直接调用任何 C 库中的函数,无需使用封装。
\n\n导入 C 函数
\n\n创建一个 bridge.h 文件,并在其中写入所需的头文件:
// bridge.h\n#include <math.h>\n#include <string.h>\n\n现在,您可以在 Swift 中直接使用这些函数:
\n// Swift\nimport Foundation\n\nlet angle = 45.0 * .pi / 180.0\nlet sine = sin(angle) // 来自 math.h 的 C 函数\nprint("45° 的正弦值:", sine)\n\n// 使用指针\nlet str = "Hello, C!"\nstr.withCString { cString in\n let length = strlen(cString) // C 函数\n print("字符串长度:", length)\n}\n\n创建自己的 C 库
\n\n假设