There are usually two ways to migrate your project from an older version of swift into the latest version.
First of all, you should download and install the latest Xcode either from AppStore or Apple Developer center.
Secondly, you have an option of either from manual mode or let Xcode do it for you.
Change it from your project setting -> Swift Language Version
, from the dropdown, select the latest version of Swift, like 4.2. Then compile/build your code, fix each warning/error one by one with some hint for Xcode like the following.
Moreover, XCode should also be able to migrate all your old version swift code into new version but somehow, we always have third party libraries or some other dependencies in the project. From my personal experience it never worked for me for a single time when projects are more complicated or with a huge code base. You may still have to go back to the manual mode again.
I've listed all migration issues I met when I was migrating from Swift 4 to 4.2 below. Please feel free to add anything I'm missing with your Pull Requests and for sure there would be a lot. With this document I hope it will help user with their migrations go smoothly and it would also be a good reference to when reviewing legacy code.
#Swift4/UIKit
Swift 4 |
Swift 4.2 |
UITableViewCellStyle |
UITableViewCell.CellStyle |
Swift 4 |
Swift 4.2 |
UIEventSubtype |
UIEvent.EventSubtype |
Swift 4 |
Swift 4.2 |
UITableViewScrollPosition |
UITableView.ScrollPosition |
UITableViewAutomaticDimension |
UITableView.automaticDimension |
UITableViewCellEditingStyle |
UITableViewCell.EditingStyle |
UITableViewRowAnimation |
UITableView.RowAnimation |
UITableViewStyle |
UITableView.Style |
UITableViewCellAccessoryType |
UITableViewCell.AccessoryType |
Swift 4 |
Swift 4.2 |
UIControlEvents |
UIControl.Event |
Swift 4 |
Swift 4.2 |
UIWindowLevelAlert |
UIWindow.Level.alert |
UIKeyboardFrameEndUserInfoKey |
UIResponder.keyboardFrameEndUserInfoKey |
UIKeyboardFrameBeginUserInfoKey |
UIResponder.keyboardFrameBeginUserInfoKey |
UIKeyboardAnimationDurationUserInfoKey |
UIResponder.keyboardAnimationDurationUserInfoKey |
UIKeyboardAnimationCurveUserInfoKey |
UIResponder.keyboardAnimationCurveUserInfoKey |
UIKeyboardIsLocalUserInfoKey |
UIResponder.keyboardIsLocalUserInfoKey |
UIWindowDidBecomeVisible |
UIWindow.didBecomeVisibleNotification |
UIWindowDidBecomeHidden |
UIWindow.didBecomeHiddenNotification |
UIWindowDidBecomeKey |
UIWindow.didBecomeKeyNotification |
UIWindowDidResignKey |
UIWindow.didResignKeyNotification |
UIKeyboardWillShow |
UIResponder.keyboardWillShowNotification |
UIKeyboardDidShow |
UIResponder.keyboardDidShowNotification |
UIKeyboardWillHide |
UIResponder.keyboardWillHideNotification |
UIKeyboardDidHide |
UIResponder.keyboardDidHideNotification |
Swift 4 |
Swift 4.2 |
open func addChildViewController(_ childController: UIViewController) |
open func addChild(_ childController: UIViewController) |
open func willMove(toParentViewController parent: UIViewController?) |
open func willMove(toParent parent: UIViewController?) |
open func didMove(toParentViewController parent: UIViewController?) |
open func didMove(toParent parent: UIViewController?) |
open func removeFromParentViewController() |
open func removeFromParent() |
Swift 4 |
Swift 4.2 |
UIActivityType |
UIActivity.ActivityType |
Swift 4 |
Swift 4.2 |
activityIndicator.activityIndicatorViewStyle |
activityIndicator.style |
Swift 4 |
Swift 4.2 |
UIAlertActionStyle |
UIAlertAction.Style |
UIAlertControllerStyle |
UIAlertController.Style |
Swift 4 |
Swift 4.2 |
UIPageViewControllerNavigationDirection |
UIPageViewController.NavigationDirection |
UIPageViewControllerSpineLocation |
UIPageViewController.SpineLocation |
UIPageViewControllerNavigationOrientation |
UIPageViewController.NavigationOrientation |
UIPageViewControllerTransitionStyle |
UIPageViewController.TransitionStyle |
UIPageViewControllerOptionsKey |
UIPageViewController.OptionsKey |
Swift 4 |
Swift 4.2 |
UINavigationControllerOperation |
UINavigationController.Operation |
Swift 4 |
Swift 4.2 |
UIGestureRecognizerStatePossible |
UIGestureRecognizer.State.possible |
UIGestureRecognizerStateBegan |
UIGestureRecognizer.State.began |
UIGestureRecognizerStateChanged |
UIGestureRecognizer.State.changed |
UIGestureRecognizerStateEnded |
UIGestureRecognizer.State.ended |
UIGestureRecognizerStateCancelled |
UIGestureRecognizer.State.cancelled |
UIGestureRecognizerStateFailed |
UIGestureRecognizer.State.failed |
UIGestureRecognizerStateRecognized |
UIGestureRecognizer.State.recognized |
Swift 4 |
Swift 4.2 |
NSLayoutFormatOptions |
NSLayoutConstraint.FormatOptions |
Swift 4 |
Swift 4.2 |
public func UIEdgeInsetsMake(_ top: CGFloat, _ left: CGFloat, _ bottom: CGFloat, _ right: CGFloat) -> UIEdgeInsets |
UIEdgeInsets(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat) |
public func UIEdgeInsetsInsetRect(_ rect: CGRect, _ insets: UIEdgeInsets) -> CGRect |
public func inset(by insets: UIEdgeInsets) -> CGRect |
Swift 4 |
Swift 4.2 |
UIFontDescriptorSymbolicTraits |
UIFontDescriptor.SymbolicTraits |
Swift 4 |
Swift 4.2 |
UIKIT_EXTERN NSData * __nullable UIImagePNGRepresentation (UIImage * __nonnull image); |
public func pngData() -> Data? |
NSData * __nullable UIImageJPEGRepresentation (UIImage * __nonnull image, CGFloat compressionQuality); |
public func jpegData (compressionQuality: CGFloat) -> Data? |
Swift 4 |
Swift 4.2 |
UIApplicationDidEnterBackground |
UIApplication.didEnterBackgroundNotification |
UIApplicationWillEnterForeground |
UIApplication.willEnterForegroundNotification |
UIApplicationDidFinishLaunching |
UIApplication.didFinishLaunchingNotification |
UIApplicationDidBecomeActive |
UIApplication.didBecomeActiveNotification |
UIApplicationWillResignActive |
UIApplication.willResignActiveNotification |
UIApplicationDidReceiveMemoryWarning |
UIApplication.didReceiveMemoryWarningNotification |
UIApplicationWillTerminate |
UIApplication.willTerminateNotification |
UIApplicationSignificantTimeChange |
UIApplication.significantTimeChangeNotification |
UIApplicationWillChangeStatusBarOrientation |
UIApplication.willChangeStatusBarOrientationNotification |
UIApplicationDidChangeStatusBarOrientation |
UIApplication.didChangeStatusBarOrientationNotification |
UIApplicationDidChangeStatusBarFrame |
UIApplication.didChangeStatusBarFrameNotification |
UIApplicationBackgroundRefreshStatusDidChange |
UIApplication.backgroundRefreshStatusDidChangeNotification |
UIApplicationProtectedDataWillBecomeUnavailable |
UIApplication.protectedDataWillBecomeUnavailableNotification |
UIApplicationProtectedDataDidBecomeAvailable |
UIApplication.protectedDataDidBecomeAvailableNotification |
UIApplicationUserDidTakeScreenshot |
UIApplication.userDidTakeScreenshotNotification |
UIApplicationOpenSettingsURLString |
UIApplication.openSettingsURLString |
UIApplicationLaunchOptionsKey |
UIApplication.LaunchOptionsKey |
UIInterfaceOrientationIsLandscape() |
UIApplication.shared.statusBarOrientation.isLandscape |
Swift 4 |
Swift 4.2 |
func bringSubview (toFront view: UIView) |
func bringSubviewToFront (_ view: UIView) |
UIViewAnimationOptions |
UIView.AnimationOptions() |
Swift 4 |
Swift 4.2 |
kCATransitionPush |
CATransitionType.push |
kCATransitionFromBottom |
CATransitionSubtype.fromBottom |
Swift 4 |
Swift 4.2 |
NSAttributedStringKey |
NSAttributedString.Key |
Swift 4 |
Swift 4.2 |
kCALineCapRound |
CAShapeLayerLineCap.round |
kCALineCapButt |
CAShapeLayerLineCap.butt |
kCALineCapSquare |
CAShapeLayerLineCap.square |
kCALineJoinMiter |
CAShapeLayerLineJoin.miter |
kCALineJoinRound |
CAShapeLayerLineJoin.round |
kCALineJoinBevel |
CAShapeLayerLineJoin.bevel |
kCAFillRuleNonZero |
CAShapeLayerFillRule.nonZero |
kCAFillRuleEvenOdd |
CAShapeLayerFillRule.evenOdd |
Other resources:
https://swift.org/migration-guide-swift4.2/
https://github.com/apple/swift-evolution
https://developer.apple.com/videos/play/wwdc2018/202/
https://github.com/apple/swift