Crate icrate

source ·
Expand description

Bindings to Apple’s frameworks

icrate is an autogenerated interface to Apple’s Objective-C frameworks like AppKit, Foundation, Metal, WebKit, and so on.

The bindings currently contain very little documentation, you should view Apple’s developer documentation for detailed information about each API. (There are plans for importing that documentation here).

Use of Deref

icrate uses the Deref trait in a bit special way: All objects deref to their superclasses. For example, NSMutableArray derefs to NSArray, which in turn derefs to NSObject.

Note that this is explicitly recommended against in the documentation and the Rust Design patterns book (see those links for details).

Due to Objective-C objects only ever being accessible behind pointers in the first place, the problems stated there are less severe, and having the implementation just means that everything is much nicer when you actually want to use the objects!

All objects also implement AsRef and AsMut to their superclass, and can be used in Id::into_super, so if you favour explicit conversion, that is a possibility too.

Rust vs. Objective-C types

A quick overview of some types you will encounter often in Objective-C, and their approximate Rust equivalent.

Objective-C(approximately) equivalent 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>
NSRangeops::Range<usize>
NSComparisonResultcmp::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<dyn Iterator<T>>
NSCopying*Box<dyn Clone>

Example

$ cargo add icrate --features=Foundation,Foundation_all
use icrate::Foundation::{ns_string, NSCopying, NSArray};

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

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

Re-exports

Modules

Macros