//! Defines types and macros for Objective-C interoperability. #![unstable(feature = "darwin_objc", issue = "145496")] #![allow(nonstandard_style)] use crate::fmt; /// Equivalent to Objective-C’s `struct objc_class` type. #[repr(u8)] pub enum objc_class { #[unstable( feature = "objc_class_variant", reason = "temporary implementation detail", issue = "none" )] #[doc(hidden)] __variant1, #[unstable( feature = "objc_class_variant", reason = "temporary implementation detail", issue = "none" )] #[doc(hidden)] __variant2, } impl fmt::Debug for objc_class { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("objc_class").finish() } } /// Equivalent to Objective-C’s `struct objc_selector` type. #[repr(u8)] pub enum objc_selector { #[unstable( feature = "objc_selector_variant", reason = "temporary implementation detail", issue = "none" )] #[doc(hidden)] __variant1, #[unstable( feature = "objc_selector_variant", reason = "temporary implementation detail", issue = "none" )] #[doc(hidden)] __variant2, } impl fmt::Debug for objc_selector { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("objc_selector").finish() } } /// Equivalent to Objective-C’s `Class` type. pub type Class = *mut objc_class; /// Equivalent to Objective-C’s `SEL` type. pub type SEL = *mut objc_selector; /// Gets a reference to an Objective-C class. /// /// This macro will yield an expression of type [`Class`] for the given class name string literal. /// /// # Example /// /// ```no_run /// #![feature(darwin_objc)] /// use core::os::darwin::objc; /// /// let string_class = objc::class!("NSString"); /// ``` #[allow_internal_unstable(rustc_attrs)] pub macro class($classname:expr) {{ // Since static Objective-C class references actually end up with multiple definitions // across dylib boundaries, we only expose the value of the static and don't provide a way to // get the address of or a reference to the static. unsafe extern "C" { #[rustc_objc_class = $classname] safe static VAL: $crate::os::darwin::objc::Class; } VAL }} /// Gets a reference to an Objective-C selector. /// /// This macro will yield an expression of type [`SEL`] for the given method name string literal. /// /// It is similar to Objective-C’s `@selector` directive. /// /// # Examples /// /// ```no_run /// #![feature(darwin_objc)] /// use core::os::darwin::objc; /// /// let alloc_sel = objc::selector!("alloc"); /// let init_sel = objc::selector!("initWithCString:encoding:"); /// ``` #[allow_internal_unstable(rustc_attrs)] pub macro selector($methname:expr) {{ // Since static Objective-C selector references actually end up with multiple definitions // across dylib boundaries, we only expose the value of the static and don't provide a way to // get the address of or a reference to the static. unsafe extern "C" { #[rustc_objc_selector = $methname] safe static VAL: $crate::os::darwin::objc::SEL; } VAL }}