Here's the full keynote slides and sample project for Swift Glue Code, presented at 360iDev 2016. This project and slide set covers:
- How to prepare your Objective-C code for migration
- A good wrapping strategy in Swift
- Some information on Swift calling conventions
There's a couple of things mentioned in the talk that are missing from the sample (direct call to Swift) but hopefully they can be added soon!
The sample code is for a CLI (command-line interface) which takes 'points' in a ridiculous, arbitrary coordinate system and can perform some basic operations on them. The scheme for the "coord-procBundle" target has some pre-set values for the command line that you can fiddle with, to run the application and see that it actually works. Play around with it a little bit!
These files were generated by running
swiftc -emit-[sil|ir|assembly] \
-sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk \
-I "/Volumes/VMware Shared Folders/confs/360idev-2016/glue-code/LibCoords/LibCoords/LibCoords-Bridge" \
-module-name LibCoords \
Location.swift > Location.[sil|ir|s]
Change your SDK reference and location of the LibCoords-Bridge directory as appropriate.
They have not been annotated themselves, but there are hints in the source code where relevant about which files correspond to where information regarding data layouts or function call parameters were derived from.
Well, in the talk, I did say that it's boring and costly to write, because you have to throw it away. One thing that I wanted to do was figure out to way to write a tool to insert into the compiler chain between either AST and SIL, or SIL and IR emission, which would examine a provided type name and automatically generate glue code for you. But the truth is that this could just be an @objc annotation, and with well-defined behavior (requiring an ABI) regarding how struct
and enum
are generated, wrapper types could be generated during the compilation phase.
While this is something that I bet the Swift team is thinking about, please join me in requesting a feature or participating in the swift-evolution mailing list to help the Swift team allow bridging every Swift type into Objective-C!