bindgen
does not (yet) have full objective-c support but it can generate bindings for a lot of the apple frameworks without too much blocklisting.
In order to generate bindings, you will need -x objective-c
as the clang args. If you'd like to use block you will need -fblocks
as a clang arg as well.
Depending on your setup, you may need --generate-block
to generate the block function aliases and --block-extern-crate
to insert a extern crate block
at the beginning of the generated bindings. The same logic applies to the --objc-extern-crate
parameter.
The objective-c classes will be represented as a struct Foo(id)
and a trait IFoo
where Foo
is the objective-c class and id
is an alias for *mut objc::runtime::Object
(the pointer to the objective-c instance). The trait IFoo
is needed to allow for the generated inheritance.
Functions that use or return objective-c pointers of instance Foo
will return Foo
. The reason this works is beacuse Foo
represented as transparent
. This will be helpful for a lot of objective-c frameworks however there are some cases where functions return instancetype
which is a type alias for id
so an occasional foo.0
may be required. An example of this would in the UIKit framework should you want to add a UILabel
to a UIStackView you will need to convert the UILabel
to a UIView
via UIView(label.0)
.
Each class (struct) has an alloc
and a dealloc
to match that of some of the alloc methods found in NSObject
.
In order to initialize a class Foo
, you will have to do something like let foo = Foo(Foo::alloc().initWithStuff())
.
To blocklist an Objective-C method, you should add the bindgen generated method path (e.g. IFoo::method
or IFoo::class_method
) as a blocklist item.
I
which stands for interface.P
which stands for Protocol.struct Foo(id)
where Foo
is the class name and id
is a pointer to the objective-c Object.aarch64-apple-ios
, you’ll need to have the clang arg --target=arm64-apple-ios
as mentioned here.time.h
as has a variable called timezone that conflicts with some of the things in NSCalendar.h
.Self
for you given class, it returns a mut * objc::runtime::Objc
which is aliased as id
. This is because objective-c‘s inheritance doesn’t perfectly match that of rusts.bindgen
against, you may end up including all of Core Foundation and any other frameworks. This will result in a very long compile time.Option
s.