1 个不稳定版本
| 0.2.0 | 2021年6月20日 |
|---|
#127 在 FFI
2,299 每月下载量
在 7 个crates中使用 (通过 pathos)
485KB
7.5K SLoC
Fruity
Rust对Apple库的绑定,由 @NikolaiVazquez 提供。
索引
捐赠
这样做使我能够创建像这样高质量的开放源代码软件。 ❤️
用法
此库可在 crates.io 上获得,并可以通过将以下内容添加到您的项目 Cargo.toml 中用于您的项目
[dependencies.fruity]
version = "0.2.0"
特性标志
每个库或框架的模块都有自己的与该名称相同的 特性标志。
例如,这是启用 foundation 模块的方法
[dependencies.fruity]
version = "0.2.0"
features = ["foundation"]
此特性会递归地启用 objc 特性/模块。
目标
惯用Rust
Fruity使在Rust中使用这些C和Objective-C API感觉自然。
-
自动引用计数。
Fruity利用Rust的 所有权模型 来为您处理对象引用计数。
NSObject是一个智能指针,它会在retain时调用Clone,并在release时调用Drop。这正是 Rust 的Arc<T>的工作方式。 -
选项<NSObject>.在 Objective-C 中,除非用
_Nonnull标记,否则所有对象都是可空的。这通常会导致要么进行非常防御性的检查,要么粗心大意地忽略空对象。Fruity 反过来,默认将所有对象(如
NSObject)设置为非空。可以通过用Option<T>包装来使对象可空。为了使 FFI 安全且易于使用,以下 Objective-C 和 Rust 类型具有 ABI 兼容性
-
NSObject * _Nonnull和NSObject -
NSObject * _Nullable和Option<NSObject>
这是因为
NSObject是一个围绕NonNull<T>指针的#[repr(transparent)]包装。 -
-
结果<T, NSError>.在 Objective-C 中,方法接受一个指向
NSError的指针,用于在失败时放置。这使得避免错误处理并假设快乐路径变得容易,这可能导致错误发生时出现错误。Fruity 反而返回一个
Result,这是 Rust 中处理错误的规范方式。这确保了错误必须以某种方式得到承认。 -
自然继承。
这些类型中的大多数都是继承自彼此的类。由于 Rust 中不可能实现真正的继承,因此 Fruity 使用
Deref来模拟 Objective-C 子类化。 -
构建器模式。
像
DispatchQueue这样的类型有许多可配置的输入来创建实例。其中许多输入都有标准默认值,因此每次都指定它们都显得很繁琐。Swift 通过在init中具有默认参数来解决此问题。然而,Rust 没有默认函数参数。Fruity 通过使用 builder 模式 来解决这个问题。以
DispatchQueueBuilder为例。这减少了创建调度队列的代码并简化了它。
零成本
使用Fruity与Objective-C库进行接口交互应该与直接在Objective-C中编写相同代码具有尽可能低的运行时成本。
以下情况也是如此
-
调用对象方法。
方法调度总是直接的,不需要其他使用
objc::msg_send!宏的包装器错误检查开销。这也通过不产生本不会调用的恐慌来减少了程序的大小。这个库经过精心编写,以确保调用
objc_msgSend时总是使用正确的对象类型、方法选择器和参数。 -
获取静态类。
像
NSString::class这样的获取器直接通过其符号获取类。这是瞬时的,尤其是在与通过objc_getClass调用Objective-C运行时相比时。 -
从Rust字符串字面量创建
NSString。nsstring!宏在编译时创建一个NSString文字面量(即@"string")。这没有运行时调度/分配/初始化成本。
这个库的某些部分仍然不是零成本。您的帮助将非常受欢迎!
这些是
selector!宏。有关详细信息,请参阅 问题 #2。
许可
该项目可选择在 MIT 许可证 或 Apache 许可证(版本 2.0) 下发布。