Swift 通晓多种语言:与 Python、C 及其他语言集成指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么 Swift 需要“了解”其他语言?

\n\n

想象一下,您是一家高级餐厅的主厨。您有一把招牌刀(Swift)——锋利、符合人体工学、握感极佳。但是,要处理河豚鱼,您需要一把特殊的手术刀(C);而要制作完美的慕斯,则需要一台昂贵的搅拌机(Python)。您不会用主刀去剁鱼吧?编程也是如此:Swift 与其他语言的集成并非示弱,而是技艺的巅峰。

\n\n

Swift 生态系统正在迅速发展,但它并非存在于真空中。机器学习库是用 Python 编写的,高性能解析器是用 C 编写的,而银行系统的遗留代码则是用 C++ 编写的。能够融合这些世界为开发者打开了无限可能。在本文中,我们将探讨三种关键场景:如何让 Swift 与 Python、C 和 C++ 协同工作。

\n\n

1. Swift + Python:PythonKit 的魔力

\n\n

苹果公司一贯的风格是让集成尽可能“Swift 化”。PythonKit 是一个框架,它允许您直接从 Swift 调用 Python 代码,就像调用原生函数一样。安装很简单:只需通过 Swift Package Manager 添加依赖项即可。

\n\n

项目设置

\n\n

在 Package.swift 中添加:

\n\n
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\n

Python 文件 (fib.py):

\n
def fib(n):\n    a, b = 0, 1\n    for _ in range(n):\n        a, b = b, a + b\n    return a
\n\n

Swift 代码:

\n
import 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

何时需要这样做?

\n
    \n
  • 您需要 Swift 中没有的库(例如 pandas 或 scikit-learn)。
  • \n
  • 您正在使用 Vapor 编写服务器端应用,并希望将 Python 用于 ETL 流程。
  • \n
  • 您在 Python 中原型设计 ML 模型,然后将其嵌入到 iOS 应用中。
  • \n
\n\n

2. Swift + C:与“硬件”直接对话

\n\n

C 是一种传奇语言。操作系统内核、驱动程序以及 Unix 世界的一半都是用 C 编写的。Swift 的设计目标是使 与 C 的互操作性 尽可能无缝。您可以直接调用任何 C 库中的函数,无需使用封装。

\n\n

导入 C 函数

\n\n

创建一个 bridge.h 文件,并在其中写入所需的头文件:

\n
// 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

假设

博客

书籍推荐