diff --git a/Advanced NSOperations.xcodeproj/project.pbxproj b/Advanced NSOperations.xcodeproj/project.pbxproj index 4ff1888..90e4962 100644 --- a/Advanced NSOperations.xcodeproj/project.pbxproj +++ b/Advanced NSOperations.xcodeproj/project.pbxproj @@ -345,6 +345,7 @@ 551B9BDC1AEB1C9700302388 = { CreatedOnToolsVersion = 6.3; DevelopmentTeam = X45WPY5JFZ; + LastSwiftMigration = 1320; SystemCapabilities = { com.apple.iCloud = { enabled = 1; @@ -581,7 +582,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.samhuri.apple-samplecode.Earthquakes"; PRODUCT_NAME = Earthquakes; PROVISIONING_PROFILE = ""; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -599,7 +600,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "net.samhuri.apple-samplecode.Earthquakes"; PRODUCT_NAME = Earthquakes; PROVISIONING_PROFILE = ""; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Earthquakes/AlertOperation.swift b/Earthquakes/AlertOperation.swift index fe1afc4..26e1720 100644 --- a/Earthquakes/AlertOperation.swift +++ b/Earthquakes/AlertOperation.swift @@ -52,7 +52,7 @@ class AlertOperation: EarthquakeOperation { addCondition(condition: MutuallyExclusive()) } - func addAction(title: String, style: UIAlertActionStyle = .default, handler: @escaping (AlertOperation) -> Void = { _ in }) { + func addAction(title: String, style: UIAlertAction.Style = .default, handler: @escaping (AlertOperation) -> Void = { _ in }) { let action = UIAlertAction(title: title, style: style) { [weak self] _ in if let strongSelf = self { handler(strongSelf) diff --git a/Earthquakes/BackgroundObserver.swift b/Earthquakes/BackgroundObserver.swift index ba8435a..5b3b7b1 100644 --- a/Earthquakes/BackgroundObserver.swift +++ b/Earthquakes/BackgroundObserver.swift @@ -18,16 +18,16 @@ import UIKit class BackgroundObserver: NSObject, OperationObserver { // MARK: Properties - private var identifier = UIBackgroundTaskInvalid + private var identifier = UIBackgroundTaskIdentifier.invalid private var isInBackground = false override init() { super.init() // We need to know when the application moves to/from the background. - NotificationCenter.default.addObserver(self, selector: #selector(BackgroundObserver.didEnterBackground(notification:)), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(BackgroundObserver.didEnterBackground(notification:)), name: UIApplication.didEnterBackgroundNotification, object: nil) - NotificationCenter.default.addObserver(self, selector: #selector(BackgroundObserver.didEnterForeground(notification:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(BackgroundObserver.didEnterForeground(notification:)), name: UIApplication.didBecomeActiveNotification, object: nil) isInBackground = UIApplication.shared.applicationState == .background @@ -56,7 +56,7 @@ class BackgroundObserver: NSObject, OperationObserver { } private func startBackgroundTask() { - if identifier == UIBackgroundTaskInvalid { + if identifier == UIBackgroundTaskIdentifier.invalid { identifier = UIApplication.shared.beginBackgroundTask(withName: "BackgroundObserver", expirationHandler: { self.endBackgroundTask() }) @@ -64,9 +64,9 @@ class BackgroundObserver: NSObject, OperationObserver { } private func endBackgroundTask() { - if identifier != UIBackgroundTaskInvalid { - UIApplication.shared.endBackgroundTask(identifier) - identifier = UIBackgroundTaskInvalid + if identifier != UIBackgroundTaskIdentifier.invalid { + UIApplication.shared.endBackgroundTask(convertToUIBackgroundTaskIdentifier(identifier.rawValue)) + identifier = UIBackgroundTaskIdentifier.invalid } } @@ -80,3 +80,8 @@ class BackgroundObserver: NSObject, OperationObserver { endBackgroundTask() } } + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertToUIBackgroundTaskIdentifier(_ input: Int) -> UIBackgroundTaskIdentifier { + return UIBackgroundTaskIdentifier(rawValue: input) +} diff --git a/Earthquakes/Operations/CKContainer+Operations.swift b/Earthquakes/Operations/CKContainer+Operations.swift index 47d19ea..d1fc77d 100644 --- a/Earthquakes/Operations/CKContainer+Operations.swift +++ b/Earthquakes/Operations/CKContainer+Operations.swift @@ -24,7 +24,7 @@ extension CKContainer { operation fails. If the verification was successful, this value will be `nil`. */ - func verifyPermission(permission: CKApplicationPermissions, requestingIfNecessary shouldRequest: Bool = false, completion: @escaping (Error?) -> Void) { + func verifyPermission(permission: CKContainer.ApplicationPermissions, requestingIfNecessary shouldRequest: Bool = false, completion: @escaping (Error?) -> Void) { verifyAccountStatus(container: self, permission: permission, shouldRequest: shouldRequest, completion: completion) } } @@ -33,7 +33,7 @@ extension CKContainer { Make these helper functions instead of helper methods, so we don't pollute `CKContainer`. */ -private func verifyAccountStatus(container: CKContainer, permission: CKApplicationPermissions, shouldRequest: Bool, completion: @escaping (Error?) -> Void) { +private func verifyAccountStatus(container: CKContainer, permission: CKContainer.ApplicationPermissions, shouldRequest: Bool, completion: @escaping (Error?) -> Void) { container.accountStatus { accountStatus, accountError in if accountStatus == .available { if permission != [] { @@ -50,7 +50,7 @@ private func verifyAccountStatus(container: CKContainer, permission: CKApplicati } } -private func verifyPermission(container: CKContainer, permission: CKApplicationPermissions, shouldRequest: Bool, completion: @escaping (Error?) -> Void) { +private func verifyPermission(container: CKContainer, permission: CKContainer.ApplicationPermissions, shouldRequest: Bool, completion: @escaping (Error?) -> Void) { container.status(forApplicationPermission: permission) { permissionStatus, permissionError in if permissionStatus == .granted { completion(nil) @@ -65,7 +65,7 @@ private func verifyPermission(container: CKContainer, permission: CKApplicationP } } -private func requestPermission(container: CKContainer, permission: CKApplicationPermissions, completion: @escaping (Error?) -> Void) { +private func requestPermission(container: CKContainer, permission: CKContainer.ApplicationPermissions, completion: @escaping (Error?) -> Void) { DispatchQueue.main.async { container.requestApplicationPermission(permission) { requestStatus, requestError in if requestStatus == .granted { diff --git a/Earthquakes/Operations/CloudCondition.swift b/Earthquakes/Operations/CloudCondition.swift index be7921c..2a0e727 100644 --- a/Earthquakes/Operations/CloudCondition.swift +++ b/Earthquakes/Operations/CloudCondition.swift @@ -23,7 +23,7 @@ struct CloudContainerCondition: OperationCondition { let container: CKContainer // this is the container to which you need access. - let permission: CKApplicationPermissions + let permission: CKContainer.ApplicationPermissions /** - parameter container: the `CKContainer` to which you need access. @@ -31,7 +31,7 @@ struct CloudContainerCondition: OperationCondition { container. This parameter has a default value of `[]`, which would get you anonymized read/write access. */ - init(container: CKContainer, permission: CKApplicationPermissions = []) { + init(container: CKContainer, permission: CKContainer.ApplicationPermissions = []) { self.container = container self.permission = permission } @@ -64,9 +64,9 @@ struct CloudContainerCondition: OperationCondition { */ private class CloudKitPermissionOperation: EarthquakeOperation { let container: CKContainer - let permission: CKApplicationPermissions + let permission: CKContainer.ApplicationPermissions - init(container: CKContainer, permission: CKApplicationPermissions) { + init(container: CKContainer, permission: CKContainer.ApplicationPermissions) { self.container = container self.permission = permission super.init() diff --git a/Earthquakes/Operations/LocationCondition.swift b/Earthquakes/Operations/LocationCondition.swift index 09d32dd..17870ae 100644 --- a/Earthquakes/Operations/LocationCondition.swift +++ b/Earthquakes/Operations/LocationCondition.swift @@ -36,7 +36,7 @@ struct LocationCondition: OperationCondition { func evaluateForOperation(operation: EarthquakeOperation, completion: (OperationConditionResult) -> Void) { let enabled = CLLocationManager.locationServicesEnabled() - let actual = CLLocationManager.authorizationStatus() + let actual = CLLocationManager().authorizationStatus var error: NSError? @@ -101,7 +101,7 @@ private class LocationPermissionOperation: EarthquakeOperation { Not only do we need to handle the "Not Determined" case, but we also need to handle the "upgrade" (.WhenInUse -> .Always) case. */ - switch (CLLocationManager.authorizationStatus(), usage) { + switch (CLLocationManager().authorizationStatus, usage) { case (.notDetermined, _), (.authorizedWhenInUse, .Always): DispatchQueue.main.async { self.requestPermission() diff --git a/Earthquakes/SplitViewController.swift b/Earthquakes/SplitViewController.swift index 2b0739d..dbf5579 100644 --- a/Earthquakes/SplitViewController.swift +++ b/Earthquakes/SplitViewController.swift @@ -14,7 +14,7 @@ class SplitViewController: UISplitViewController { override func awakeFromNib() { super.awakeFromNib() - preferredDisplayMode = .allVisible + preferredDisplayMode = .oneBesideSecondary delegate = self }