58 个版本
新 0.1.57 | 2024 年 8 月 15 日 |
---|---|
0.1.55 | 2024 年 4 月 29 日 |
0.1.53 | 2024 年 3 月 26 日 |
0.1.52 | 2023 年 7 月 10 日 |
0.1.5 | 2021 年 11 月 26 日 |
#497 in Rust 模式
48,256 每月下载量
用于 5 crate
1MB
25K SLoC
swift-bridge
swift-bridge
促进 Rust 和 Swift 之间的互操作性。
swift-bridge
使得在 Rust 和 Swift 之间传递和共享高级类型变得简单,例如 String
、Option<T>
、Result<T, E>
、struct
、class
等。
它还帮助您连接更高层次的语言特性,如异步函数和泛型。
使用 swift-bridge
应该比手动管理 Rust 和 Swift FFI 更安全、更高效、更直观。
安装
# In your Cargo.toml
[build-dependencies]
swift-bridge-build = "0.1"
[dependencies]
swift-bridge = "0.1"
书籍
您可以在 《swift-bridge
书籍》 中找到有关如何使用 Rust 和 Swift 的信息。
快速预览
您通过在 "桥梁模块" 中声明要导入和导出的类型和函数来使用 swift-bridge
,然后使用 #[swift_bridge::bridge]
宏来注解该桥梁模块。
然后,在构建时,您可以使用 swift-bridge-build
API 或 swift-bridge-cli
CLI 来解析您注释的桥接模块,并生成 FFI 层的 Swift
和 C
部分。
以下是如何使用桥接模块描述 Swift 和 Rust 之间 FFI 边界的快速预览。
// We use the `swift_bridge::bridge` macro to declare a bridge module.
// Then at build time the `swift-bridge-build` crate is used to generate
// the corresponding Swift and C FFI glue code.
#[swift_bridge::bridge]
mod ffi {
// Create "transparent" structs where both Rust and Swift can directly access the fields.
struct AppConfig {
file_manager: CustomFileManager,
}
// Transparent enums are also supported.
enum UserLookup {
ById(UserId),
ByName(String),
}
// Export opaque Rust types, functions and methods for Swift to use.
extern "Rust" {
type RustApp;
#[swift_bridge(init)]
fn new(config: AppConfig) -> RustApp;
fn get_user(&self, lookup: UserLookup) -> Option<&User>;
}
extern "Rust" {
type User;
type MessageBoard;
#[swift_bridge(get(&nickname))]
fn informal_name(self: &User) -> &str;
}
// Import opaque Swift classes and functions for Rust to use.
extern "Swift" {
type CustomFileManager;
fn save_file(&self, name: &str, contents: &[u8]);
}
}
struct User {
nickname: String
}
快速入门
swift-bridge
仓库包含示例应用程序,您可以使用这些应用程序快速尝试库,或者作为您自己的基于 Swift
+ Rust
的应用程序的起点。
例如,这是如何在本地运行 codegen-visualizer
示例项目的步骤。
git clone https://github.com/chinedufn/swift-bridge
cd swift-bridge/examples/codegen-visualizer
open CodegenVisualizer/CodegenVisualizer.xcodeproj
# *** Click the "Run" button at the top left of Xcode ***
您可以在 《swift-bridge
书籍》 中找到有关如何使用 Rust 和 Swift 的信息。
内置类型
除了允许您在 Rust 和 Swift 之间共享自定义的结构体、枚举和类之外,swift-bridge
还支持许多 Rust 和 Swift 标准库类型。
Rust 中的名称 | Swift 中的名称 | 备注 |
---|---|---|
u8, i8, u16, i16... 等 | UInt8, Int8, UInt16, Int16 ... 等 | |
bool | Bool | |
String, &String, &mut String | RustString, RustStringRef, RustStringRefMut | |
&str | RustStr | |
Vec<T> | RustVec<T> | |
SwiftArray<T> | Array<T> | 尚未实现 |
&[T] | 尚未实现 | |
&mut [T] | 尚未实现 | |
Box<T> | 尚未实现 | |
Box<dyn FnOnce(A,B,C) -> D> | (A, B, C) -> D | 从 Rust 传递到 Swift 是支持的,但 Swift 到 Rust 尚未实现。 |
Box<dyn Fn(A,B,C) -> D> | (A, B, C) -> D | 尚未实现 |
Arc<T> | 尚未实现 | |
[T; N] | 尚未实现 | |
*const T | UnsafePointer<T> | |
*mut T | UnsafeMutablePointer<T> | |
Option<T> | Optional<T> | |
fn x() -> Result<T, E> | func x() throws -> T | |
fn x(arg: Result<T, E>) | func x(arg: RustResult<T, E>) | |
(A, B, C, ...) | (A, B, C, ...) | |
您有 Rust 标准库类型的想法吗? 提交一个 issue! |
||
您有 Swift 标准库类型的想法吗? 提交一个 issue! |
性能
swift-bridge
致力于在性能关键环境中发挥作用。
其生成的 FFI 代码不使用对象序列化、克隆、同步或其他任何形式的不必要开销。
测试
运行测试套件。
# Clone the repository
git clone [email protected]:chinedufn/swift-bridge.git
cd swift-bridge
# Run tests
cargo test --all && ./test-swift-rust-integration.sh && ./test-swift-packages.sh
贡献
如果您想为 swift-bridge
贡献,请查看贡献者指南。
在熟悉贡献过程之后,尝试查看一些 好的入门问题,看看是否有任何问题引起您的兴趣。
这些问题附带逐步说明,应该有助于引导您实现您的第一个补丁。
致谢
- cxx 启发了使用桥接模块描述 FFI 边界这一想法。
许可
许可协议为 MIT 或 Apache-2.0。
lib.rs
:
解析 Rust 源文件中的 #[swift_bridge::bridge] 模块,然后生成相应的 C 头文件和 Swift 文件。
依赖关系
~3–11MB
~139K SLoC