Converting Complex Objective-C Codebases to Swift
The swifting.io team has previously published a very thorough review of the Swiftify converter. Their review included a section on code that Swiftify failed to convert; or failed to produce the best output.
Over the past few releases we have been working on many new features and fixes to address those issues. Since we have begun working on those fixes, Swiftify has gained some great new abilities. Swiftify now has better handling of optionals, type conversions, blocks, and it is aware of your project’s class hierarchy.
The result of this is that the project used as a demo by the swifting.io team is now converted to Swift with zero build-time errors!
Better Handling of Blocks
Swiftify now has full support for block nullability specifiers, return type, and parameters.
init method wouldn't have been converted correctly to Swift, resulting in code that doesn't build.
Swiftify will now convert this correctly, providing a Swift closure that has the correct parameters and return type.
Calls to this
init method, that would pass a block that previously failed to be converted, can now be converted correctly too.
Now Swiftify will convert it into the following call, correctly converting the block that was passed.
Class Hierarchy Support
Swiftify is now aware of classes and interfaces that are declared in either Apple frameworks or the user code. As a result of this, Swiftify is now able to correctly detect whether
override keyword should be added to the converted Swift code.
Previously, the following methods in
DataSource.m would result in the converted methods having the
Swiftify now detects the super class of
DataSource.m and thus, the
override keyword doesn't get added.
Skipping of self Prefix
Swiftify now intelligently skips the
self. prefix for variables and methods, unless it's required by the Swift compiler (ex. conflicting local variable names, or accessing self inside blocks).
The following code would previously result in adding
Now, it skips adding
self.prefix as it is no longer required.
Comparison of Optionals to nil
The comparison of optionals to nil are now correctly handled by Swiftify.
Previously, the following method, which contains a nil check for
set wouldn't be converted correctly.
Swiftify will now correctly do a nil check for the optional
Usage of dispatch_once
dispatch_once is now converted appropriately to make sure the block of code that was inside
dispatch_once is only executed once.
The following method previously resulted in the converted Swift code continuing to use
Now, it will replace the usage of
dispatch_once, resulting in the following Swift code.
This Swift code is not ideal for all uses since it’s not thread-safe. We are currently working on converting usage of
dispatch_once to a lazy-loaded variable.
Usage of Masonry
Masonry is a framework that wraps Auto Layout to provide a nicer syntax through its own DSL.
Swiftify previously couldn’t convert constraints created though Masonry’s DSL correctly. The following usage of Masonry resulted in code that did not build.
Swiftify can now correctly convert Masonry’s DSL.
Methods in Categories
UIView+Additions.m the following method, added through a category on
UIView, would be converted to Swift code that builds correctly, but results in a crash when the app is run.
Previously, the converted Swift code would return a
So when this method was called on a subclass of
UIView, as follows, it would return the wrong type, resulting in a crash.
This has been fixed. The converted code now returns
Self, so it would work correctly on any subclass of
Convert Your Project
Swiftify’s Advanced Project Converter can now convert entire projects or multiple files at once. With support for advanced language features, this will significantly reduce the amount of work you’ll have to do to convert your Objective-C code to Swift.
Install Swiftify for Xcode from the Mac App Store and give it a try.
To see the converted Swift code and the original Objective-C project, check this repository on GitHub.
For more guidance, read our post on Swiftify’s Advanced Project Converter, and please share your questions in the comments section below.