5 releases

0.1.0 Dec 23, 2023
0.0.4 Jul 31, 2023
0.0.3 Jun 20, 2023
0.0.2 Feb 7, 2023
0.0.0 Sep 19, 2022

#40 in Accessibility

Download history 3670/week @ 2023-11-01 4387/week @ 2023-11-08 5532/week @ 2023-11-15 6127/week @ 2023-11-22 4451/week @ 2023-11-29 4583/week @ 2023-12-06 5706/week @ 2023-12-13 6147/week @ 2023-12-20 7129/week @ 2023-12-27 11375/week @ 2024-01-03 11610/week @ 2024-01-10 14762/week @ 2024-01-17 16070/week @ 2024-01-24 16491/week @ 2024-01-31 19642/week @ 2024-02-07 18546/week @ 2024-02-14

73,041 downloads per month
Used in 356 crates (16 directly)

MIT license

10MB
212K SLoC

icrate

Latest version License Documentation CI

Rust bindings to Apple's frameworks.

This README is kept intentionally small in an effort to consolidate the documentation, see the Rust docs for more details.

Supported versions

These bindings are automatically generated from the SDKs in Xcode 15.0.1 (will be periodically updated).

Currently supports:

  • 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:

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>
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<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:?}");

Dependencies