7 个版本

0.1.2 2024 年 4 月 17 日
0.1.1 2024 年 4 月 17 日
0.1.0 2023 年 12 月 23 日
0.0.4 2023 年 7 月 31 日
0.0.0 2022 年 9 月 19 日

#181 in macOS 和 iOS API

Download history 23901/week @ 2024-04-30 19766/week @ 2024-05-07 20393/week @ 2024-05-14 23614/week @ 2024-05-21 25350/week @ 2024-05-28 25800/week @ 2024-06-04 56728/week @ 2024-06-11 51936/week @ 2024-06-18 53694/week @ 2024-06-25 40171/week @ 2024-07-02 33723/week @ 2024-07-09 31744/week @ 2024-07-16 24632/week @ 2024-07-23 19122/week @ 2024-07-30 20987/week @ 2024-08-06 20027/week @ 2024-08-13

89,570 每月下载量
用于 544 个 crate (13 个直接使用)

MIT 许可证

10MB
215K SLoC

icrate

Latest version License Documentation CI

Rust 到 Apple 框架的绑定。

此 crate 已拆分为多个较小的 crate,现已弃用!

有关可用 crate 的列表,请参阅 objc2

支持的版本

这些绑定是自动从 Xcode 15.0.1 的 SDK 中生成的(将定期更新)。

目前支持

  • macOS: 10.12-14.0
  • iOS/iPadOS: 10.0-17.0 (WIP)
  • tvOS: 10.0-17.0 (WIP)
  • watchOS: 5.0-10.0 (WIP)

lib.rs:

绑定到 Apple 的框架

icrate 是 Apple 的 Objective-C 框架(如 AppKit、Foundation、Metal、WebKit 等)的自动生成的接口。

当前绑定包含的文档非常少,您应查看 Apple 的开发者文档 以获取有关每个 API 的详细信息。(有计划导入该文档)。

Deref 的使用

icrate 以一种独特的方式使用 Deref trait:所有对象都解引用到它们的超类。例如,NSMutableArray 解引用到 NSArray,后者又解引用到 NSObject

请注意,这在文档中Rust 设计模式书籍中被明确建议不要这样做(查看这些链接以获取详细信息)。

由于 Objective-C 对象最初只能在指针后面访问,因此那里提到的问题不太严重,而且只有当您实际上想要使用这些对象时,实现它们才意味着一切都变得更加美好!

所有对象还实现了到它们超类的 AsRefAsMut,并可以在 Id::into_super 中使用,因此如果您更喜欢显式转换,这也是一个可能性。

Rust 与 Objective-C 类型

以下是您在 Objective-C 中经常会遇到的某些类型的快速概述,以及它们的近似 Rust 等价物。

Objective-C (约)等效 Rust
NSData* Arc<[u8]>
NSMutableData* Vec<u8>
NSString* Arc<str>
NSMutableString* String
NSValue* Arc<dyn Any>
NSNumber* Arc<enum{ I8(i8), U8(u8), I16(i16), U16(u16), I32(i32), U32(u32), I64(i64), U64(u64), F32(f32), F64(f64),CLong(ffi::c_long),CULong(ffi::c_ulong) }>
NSError* Arc<dyn Error+ Send + Sync>
NSException* Arc<dyn Error+ Send + Sync>
NSRange ops::Range<usize>
NSComparisonResult cmp::Ordering
NSArray<T>* Arc<[T]>
NSMutableArray<T>* Vec<T>
NSDictionary<K, V>* Arc<HashMap<K, V>>
NSMutableDictionary<K, V>* HashMap<K, V>
NSEnumerator<T>* Box<dynIterator<T>>
NSCopying* Box<dynClone>

示例

$ cargo add icrate --features=Foundation,Foundation_all

使用 icrate::Foundation::{ns_string, NSCopying, NSArray};

let string = ns_string!("world"); println!("hello {string}");

let array = NSArray::from_id_slice(&[string.copy()]); println!("{array:?}");

依赖关系