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 |
|
#181 in macOS 和 iOS API
89,570 每月下载量
用于 544 个 crate (13 个直接使用)
10MB
215K SLoC
icrate
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 对象最初只能在指针后面访问,因此那里提到的问题不太严重,而且只有当您实际上想要使用这些对象时,实现它们才意味着一切都变得更加美好!
所有对象还实现了到它们超类的 AsRef
和 AsMut
,并可以在 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:?}");