10 releases

new 0.2.2 May 21, 2024
0.2.0 Apr 17, 2024
0.2.0-alpha.6 Jul 19, 2022
0.2.0-alpha.4 Jan 3, 2022
0.2.0-alpha.2 Nov 22, 2021

#43 in macOS and iOS APIs

Download history 4/week @ 2024-01-31 3/week @ 2024-02-14 62/week @ 2024-02-21 24/week @ 2024-02-28 14/week @ 2024-03-06 50/week @ 2024-03-13 15/week @ 2024-03-27 25/week @ 2024-04-03 528/week @ 2024-04-17 10313/week @ 2024-04-24 32328/week @ 2024-05-01 28494/week @ 2024-05-08 31766/week @ 2024-05-15

103,023 downloads per month
Used in 560 crates (81 directly)

MIT license

59K SLoC


Latest version License Documentation CI

Rust bindings to Apple's framework Foundation.

This README is kept intentionally small to consolidate the documentation, see the Rust docs for more details on this crate.

This crate is part of the objc2 project, see that for related crates.


Bindings to the Foundation framework

See Apple's docs and the general docs on framework crates for more information.

This is the [std] equivalent for Objective-C, containing essential data types, collections, and operating-system services.

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>


Basic usage of a few Foundation types.

$ cargo add objc2-foundation --features=all
use objc2_foundation::{ns_string, NSCopying, NSArray};

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

let array = NSArray::from_id_slice(&[string.copy()]);

An example showing how to define your own interfaces to parts that may be missing in the autogenerated interface.