Using Swift CFunctionPointer to pass a callback to CoreMIDI API

In Swift 2.0 (as part of Xcode 7), C APIs that deal in function pointers use function types that are annotated @convention(c). You can pass any Swift function, method, or closure as a @convention(c) function type — but only if that closure conforms to C conventions… e.g. it can’t capture state from its surrounding scope.

For details, see Type Attributes in The Swift Programming Language.


As for what’s in Xcode 6: Swift 1.x doesn’t have a way to convert a Swift function or closure to a C function pointer — the sole use of the CFunctionPointer type is to pass function pointers imported from (Obj)C APIs to other (Obj)C APIs.

You can declare a function pointer in C code that you expose to Swift via your project’s bridging header, then use Swift to pass that to CoreMIDI. But since you’re going to be reaching across a bridge anyway, you might instead think about which parts of your project are best to keep in C and what the best interface is from those parts to your Swift code is.

Leave a Comment