7 releases

0.1.2 Apr 17, 2024
0.1.1 Apr 17, 2024
0.1.0 Dec 23, 2023
0.0.4 Jul 31, 2023
0.0.0 Sep 19, 2022

#209 in macOS and iOS APIs

Download history 25975/week @ 2024-07-22 19584/week @ 2024-07-29 19629/week @ 2024-08-05 21441/week @ 2024-08-12 17736/week @ 2024-08-19 19574/week @ 2024-08-26 17407/week @ 2024-09-02 15553/week @ 2024-09-09 14884/week @ 2024-09-16 18615/week @ 2024-09-23 14113/week @ 2024-09-30 14195/week @ 2024-10-07 12917/week @ 2024-10-14 11600/week @ 2024-10-21 10708/week @ 2024-10-28 13274/week @ 2024-11-04

49,710 downloads per month
Used in 430 crates (13 directly)

MIT license

10MB
215K SLoC

icrate

Latest version License Documentation CI

Rust bindings to Apple's frameworks.

This crate has been split into multiple smaller ones, and is now deprecated!

See objc2 for the list of available crates.

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