1 个不稳定版本

0.2.0 2021年6月20日

#127FFI

Download history 404/week @ 2024-03-14 469/week @ 2024-03-21 565/week @ 2024-03-28 722/week @ 2024-04-04 718/week @ 2024-04-11 592/week @ 2024-04-18 411/week @ 2024-04-25 399/week @ 2024-05-02 465/week @ 2024-05-09 464/week @ 2024-05-16 415/week @ 2024-05-23 503/week @ 2024-05-30 532/week @ 2024-06-06 582/week @ 2024-06-13 661/week @ 2024-06-20 447/week @ 2024-06-27

2,299 每月下载量
7 个crates中使用 (通过 pathos)

MIT/Apache

485KB
7.5K SLoC

Fruity

github crates.io docs.rs

Rust对Apple库的绑定,由 @NikolaiVazquez 提供。

索引

  1. 捐赠
  2. 用法
    1. 特性标志
  3. 目标
    1. 惯用Rust
    2. 零成本
  4. 许可

捐赠

如果这个项目对您有用,请考虑 赞助我直接捐赠

这样做使我能够创建像这样高质量的开放源代码软件。 ❤️

用法

此库可在 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 * _NonnullNSObject

    • NSObject * _NullableOption<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) 下发布。

依赖项