9 个版本

使用旧的 Rust 2015

0.1.6 2016 年 5 月 8 日
0.1.5 2016 年 4 月 4 日
0.1.4 2015 年 11 月 12 日
0.1.2 2015 年 10 月 10 日
0.0.1 2015 年 4 月 17 日

#36 in macOS 和 iOS API

Download history 91074/week @ 2024-03-14 103377/week @ 2024-03-21 112916/week @ 2024-03-28 84493/week @ 2024-04-04 90478/week @ 2024-04-11 100483/week @ 2024-04-18 82644/week @ 2024-04-25 73202/week @ 2024-05-02 66235/week @ 2024-05-09 80769/week @ 2024-05-16 73415/week @ 2024-05-23 71168/week @ 2024-05-30 74117/week @ 2024-06-06 90334/week @ 2024-06-13 85623/week @ 2024-06-20 76555/week @ 2024-06-27

339,025 每月下载量
用于 3,495 个 (55 个直接)

MIT 许可证

16KB
290

Rust 对 Apple 的 C 语言扩展块接口。

有关块实现的详细信息,请参阅 Clang 的文档:https://clang.llvm.net.cn/docs/Block-ABI-Apple.html

调用块

使用 Block 结构从 Objective-C 调用块。例如,考虑以下 Objective-C 函数

int32_t sum(int32_t (^block)(int32_t, int32_t)) {
    return block(5, 8);
}

我们可以将其写成如下 Rust 代码

unsafe fn sum(block: &Block<(i32, i32), i32>) -> i32 {
    block.call((5, 8))
}

请注意在 call 方法中多出的括号,因为必须将参数作为元组传递。

创建块

可以使用 ConcreteBlock 结构创建传递给 Objective-C 的块。例如,要创建一个将两个 i32 相加的块,我们可以写

let block = ConcreteBlock::new(|a: i32, b: i32| a + b);
let block = block.copy();
assert!(unsafe { block.call((5, 8)) } == 13);

在将块传递给 Objective-C 之前,重要的事情是使用 copy 方法将块复制到堆上;这是因为我们的 ConcreteBlock 只能复制一次,我们可以在 Rust 中强制执行此操作,但如果 Objective-C 代码复制两次,则可能会出现双重释放。

没有运行时依赖