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) 下发布。