Crate objc2_encode
source · [−]Expand description
Objective-C type-encoding
This is re-exported into the top level of objc2.
The Objective-C directive @encode encodes types as strings, and this is
used in various places in the runtime.
This crate provides the Encoding type to efficiently describe and
compare these type-encodings.
Additionally it provides traits for annotating types that has an
Objective-C encoding: Specifically Encode for structs, RefEncode
for references and EncodeArguments for function arguments.
This crate is exported under the objc2 crate as objc2::encode, so
usually you would just use it from there.
Example
Implementing Encode and RefEncode for a custom type:
use objc2_encode::{Encode, Encoding, RefEncode};
// or from objc2:
// use objc2::{Encode, Encoding, RefEncode};
#[repr(C)]
struct MyStruct {
a: f32, // float
b: i16, // int16_t
}
unsafe impl Encode for MyStruct {
const ENCODING: Encoding<'static> = Encoding::Struct(
"MyStruct", // Must use the same name as defined in C header files
&[
f32::ENCODING, // Same as Encoding::Float
i16::ENCODING, // Same as Encoding::Short
],
);
}
// @encode(MyStruct) -> "{MyStruct=fs}"
assert!(MyStruct::ENCODING.equivalent_to_str("{MyStruct=fs}"));
unsafe impl RefEncode for MyStruct {
// Note that if `MyStruct` is an Objective-C instance, this should
// be `Encoding::Object`.
const ENCODING_REF: Encoding<'static> = Encoding::Pointer(&Self::ENCODING);
}
// @encode(MyStruct*) -> "^{MyStruct=fs}"
assert!(MyStruct::ENCODING_REF.equivalent_to_str("^{MyStruct=fs}"));See the examples folder for more complex usage.
Caveats
We’ve taken the pragmatic approach with Encode and RefEncode, and
have implemented it for as many types as possible (instead of defining a
bunch of subtraits for very specific purposes). However, that might
sometimes be slightly surprising.
Notably we have implemented these for bool, which, in reality, you
would never actually see in an Objective-C method (they use BOOL, see
objc2::runtime::Bool), but which can techincally occur, and as such
does make sense to define an encoding for.
The other example is (), which doesn’t make sense as a method
argument, but is a very common return type, and hence implements Encode.
Further resources
Enums
An Objective-C type-encoding.
Traits
Types that have an Objective-C type-encoding.
Types that represent an ordered group of function arguments, where each argument has an Objective-C type-encoding.
Types whoose references has an Objective-C type-encoding.