Using Swift protocols in Objective-C

Sep 3, 2014 · Follow on Twitter and Mastodon swiftdi

I’m currently creating two games for iOS. One is made in Swift & SpriteKit, while one is in Objective-C & UIKit. I now want to share logic by using my Swift protocols in Objective-C.

The good part

The apps share an Objective-C core library and use CoreMeta to bootstrap each app and select which implementation to use for a certain protocol.

Objective-C protocols in the library work great in Swift. To implement them in Swift, I just add them to my bridging header and implement them.

For instance, the Animal protocol is implemented by an AnimalView UIView in Objective-C & UIKit, while Swift & SpriteKit has an AnimalNode that inherits SKNode.

The bad part

All in all, Swift is a really nice experience. Less code, easier to read - I love it! However, as I created the Swift protocol and tried to register it with CoreMeta, I ran into problems.

CoreMeta is written in Objective-C, which lets you pass in protocols as parameters, which you with the @protocol(ProtocolName) syntax. In Swift, you use ProtocolName.self.

This works great for Objective-C protocols, but not at all for Swift protocols. Swift protocols can’t be cast to Protocol *, and thus can’t be used as method parameter with CoreMeta.

The solution

To use Swift protocols in Objective-C, just add @objc before the protocol keyword. After this, I could use bootstrap them with CoreMeta as I do with the Objective-C protocols.

Discussions & More

Please share any ideas, feedback or comments you may have in the Disqus section below, or by replying on Twitter or Mastodon.

If you found this text interesting, make sure to follow me on Twitter and Mastodon for more content like this, and to be notified when new content is published.

If you like & want to support my work, please consider sponsoring me on GitHub Sponsors.