From 774f05eae0c086cbd3f598489b1987ad372a5def Mon Sep 17 00:00:00 2001 From: Yishi Lin Date: Sat, 23 Sep 2017 16:29:03 +0800 Subject: [PATCH] Convert to Swift 4 - Will fix all warnings next. --- pass.xcodeproj/project.pbxproj | 50 ++++++++++++++----- .../xcshareddata/xcschemes/pass.xcscheme | 4 +- pass/AppDelegate.swift | 2 +- .../AboutRepositoryTableViewController.swift | 2 +- .../AdvancedSettingsTableViewController.swift | 2 +- .../CommitLogsTableViewController.swift | 2 +- .../GeneralSettingsTableViewController.swift | 12 ++--- pass/Controllers/OTPScannerController.swift | 2 +- ...nSourceComponentsTableViewController.swift | 2 +- .../Controllers/PasswordsViewController.swift | 12 ++--- pass/Controllers/QRScannerController.swift | 12 ++--- .../SettingsTableViewController.swift | 4 +- pass/Views/LabelTableViewCell.swift | 10 ++-- pass/Views/TitleTextFieldTableViewCell.swift | 2 +- passExtension/PasscodeExtensionDisplay.swift | 2 +- passKit/Helpers/Utils.swift | 2 +- passKit/Models/PasswordStore.swift | 4 +- 17 files changed, 77 insertions(+), 49 deletions(-) diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 36d2c86..a37c81f 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -693,22 +693,24 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Bob Sun"; TargetAttributes = { A26075771EEC6F34005DB03E = { CreatedOnToolsVersion = 8.3.3; - LastSwiftMigration = 0830; + LastSwiftMigration = 0900; ProvisioningStyle = Manual; }; A260757F1EEC6F34005DB03E = { CreatedOnToolsVersion = 8.3.3; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; TestTargetID = DC917BD21E2E8231000FDF54; }; A26700231EEC466A00176B8A = { CreatedOnToolsVersion = 8.3.3; DevelopmentTeam = 4WDM8E95VU; + LastSwiftMigration = 0900; ProvisioningStyle = Manual; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -722,12 +724,14 @@ DC13B14D1E8640810097803F = { CreatedOnToolsVersion = 8.3; DevelopmentTeam = 4WDM8E95VU; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; TestTargetID = DC917BD21E2E8231000FDF54; }; DC917BD21E2E8231000FDF54 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 4WDM8E95VU; + LastSwiftMigration = 0900; ProvisioningStyle = Manual; SystemCapabilities = { com.apple.ApplicationGroups.iOS = { @@ -1173,7 +1177,8 @@ SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1216,7 +1221,8 @@ SKIP_INSTALL = YES; SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = ""; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1238,7 +1244,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passKitTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pass.app/pass"; }; name = Debug; @@ -1258,7 +1265,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passKitTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pass.app/pass"; }; name = Release; @@ -1290,7 +1298,8 @@ PROVISIONING_PROFILE = "d25c9029-bca6-4b2d-b04e-4abc9d232740"; PROVISIONING_PROFILE_SPECIFIER = "match Development me.mssun.passforios.find-login-action-extension"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -1321,7 +1330,8 @@ PROVISIONING_PROFILE = "cbd86628-6f3e-40f3-b518-20d2330db545"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore me.mssun.passforios.find-login-action-extension"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -1336,7 +1346,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pass.app/pass"; }; name = Debug; @@ -1352,7 +1363,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).passTests"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/pass.app/pass"; }; name = Release; @@ -1366,7 +1378,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1374,7 +1388,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -1416,7 +1434,9 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1424,7 +1444,11 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -1480,7 +1504,8 @@ PROVISIONING_PROFILE = "2e72f4af-b935-4970-9cd3-44d4cc24b646"; PROVISIONING_PROFILE_SPECIFIER = "match Development me.mssun.passforios"; SWIFT_OBJC_BRIDGING_HEADER = "pass/Helpers/Objective-CBridgingHeader.h"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; @@ -1516,7 +1541,8 @@ PROVISIONING_PROFILE = "ee6e841d-ef77-4f00-b534-d7f1fd25dc1d"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore me.mssun.passforios"; SWIFT_OBJC_BRIDGING_HEADER = "pass/Helpers/Objective-CBridgingHeader.h"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/pass.xcodeproj/xcshareddata/xcschemes/pass.xcscheme b/pass.xcodeproj/xcshareddata/xcschemes/pass.xcscheme index 062dfaf..a02e528 100644 --- a/pass.xcodeproj/xcshareddata/xcschemes/pass.xcscheme +++ b/pass.xcodeproj/xcshareddata/xcschemes/pass.xcscheme @@ -1,6 +1,6 @@ 0} } - func actOnSearchNotification() { + @objc func actOnSearchNotification() { searchController.searchBar.becomeFirstResponder() } @@ -507,7 +507,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV reloadTableView(data: passwordsTableEntries, anim: anim) } - func actOnReloadTableViewRelatedNotification() { + @objc func actOnReloadTableViewRelatedNotification() { DispatchQueue.main.async { [weak weakSelf = self] in guard let strongSelf = weakSelf else { return } strongSelf.initPasswordsTableEntries(parent: nil) @@ -515,7 +515,7 @@ class PasswordsViewController: UIViewController, UITableViewDataSource, UITableV } } - func handleRefresh(_ syncControl: UIRefreshControl) { + @objc func handleRefresh(_ syncControl: UIRefreshControl) { syncPasswords() syncControl.endRefreshing() } diff --git a/pass/Controllers/QRScannerController.swift b/pass/Controllers/QRScannerController.swift index 13e40da..e496229 100644 --- a/pass/Controllers/QRScannerController.swift +++ b/pass/Controllers/QRScannerController.swift @@ -24,7 +24,7 @@ class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDeleg var videoPreviewLayer: AVCaptureVideoPreviewLayer? var qrCodeFrameView: UIView? - let supportedCodeTypes = [AVMetadataObjectTypeQRCode] + let supportedCodeTypes = [AVMetadataObject.ObjectType.qr] var delegate: QRScannerControllerDelegate? @@ -32,11 +32,11 @@ class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDeleg super.viewDidLoad() // Get an instance of the AVCaptureDevice class to initialize a device object and provide the video as the media type parameter. - let captureDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) + let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) do { // Get an instance of the AVCaptureDeviceInput class using the previous device object. - let input = try AVCaptureDeviceInput(device: captureDevice) + let input = try AVCaptureDeviceInput(device: captureDevice!) // Initialize the captureSession object. captureSession = AVCaptureSession() @@ -53,8 +53,8 @@ class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDeleg captureMetadataOutput.metadataObjectTypes = supportedCodeTypes // Initialize the video preview layer and add it as a sublayer to the viewPreview view's layer. - videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession) - videoPreviewLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill + videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!) + videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill videoPreviewLayer?.frame = view.layer.bounds view.layer.addSublayer(videoPreviewLayer!) @@ -90,7 +90,7 @@ class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDeleg // MARK: - AVCaptureMetadataOutputObjectsDelegate Methods - func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) { + func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) { if let metadataObj = metadataObjects.first as? AVMetadataMachineReadableCodeObject, supportedCodeTypes.contains(metadataObj.type), diff --git a/pass/Controllers/SettingsTableViewController.swift b/pass/Controllers/SettingsTableViewController.swift index 43ebf93..c8b6986 100644 --- a/pass/Controllers/SettingsTableViewController.swift +++ b/pass/Controllers/SettingsTableViewController.swift @@ -191,7 +191,7 @@ class SettingsTableViewController: UITableViewController { } } - func actOnPasswordStoreErasedNotification() { + @objc func actOnPasswordStoreErasedNotification() { setPGPKeyTableViewCellDetailText() setPasswordRepositoryTableViewCellDetailText() setPasscodeLockTouchIDCells() @@ -213,7 +213,7 @@ class SettingsTableViewController: UITableViewController { tableView.deselectRow(at: indexPath, animated: true) } - func touchIDSwitchAction(uiSwitch: UISwitch) { + @objc func touchIDSwitchAction(uiSwitch: UISwitch) { if !passcodeLockConfig.repository.hasPasscode || !isTouchIDEnabled() { // switch off DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) { diff --git a/pass/Views/LabelTableViewCell.swift b/pass/Views/LabelTableViewCell.swift index c937e9d..fd72303 100644 --- a/pass/Views/LabelTableViewCell.swift +++ b/pass/Views/LabelTableViewCell.swift @@ -104,7 +104,7 @@ class LabelTableViewCell: UITableViewCell { SecurePasteboard.shared.copy(textToCopy: cellData?.content) } - func revealPassword(_ sender: Any?) { + @objc func revealPassword(_ sender: Any?) { let plainPassword = cellData?.content ?? "" if type == .password { contentLabel.attributedText = Utils.attributedPassword(plainPassword: plainPassword) @@ -115,7 +115,7 @@ class LabelTableViewCell: UITableViewCell { passwordDisplayButton?.setImage(#imageLiteral(resourceName: "Invisible"), for: .normal) } - func concealPassword(_ sender: Any?) { + @objc func concealPassword(_ sender: Any?) { if type == .password { if cellData?.content.isEmpty == false { contentLabel.text = Globals.passwordDots @@ -129,7 +129,7 @@ class LabelTableViewCell: UITableViewCell { passwordDisplayButton?.setImage(#imageLiteral(resourceName: "Visible"), for: .normal) } - func reversePasswordDisplay(_ sender: Any?) { + @objc func reversePasswordDisplay(_ sender: Any?) { if isReveal { // conceal concealPassword(sender) @@ -139,12 +139,12 @@ class LabelTableViewCell: UITableViewCell { } } - func openLink(_ sender: Any?) { + @objc func openLink(_ sender: Any?) { // if isURLCell, passwordTableView should not be nil delegatePasswordTableView!.openLink() } - func getNextHOTP(_ sender: Any?) { + @objc func getNextHOTP(_ sender: Any?) { // if isHOTPCell, passwordTableView should not be nil delegatePasswordTableView!.getNextHOTP() } diff --git a/pass/Views/TitleTextFieldTableViewCell.swift b/pass/Views/TitleTextFieldTableViewCell.swift index b17a692..a24f5ce 100644 --- a/pass/Views/TitleTextFieldTableViewCell.swift +++ b/pass/Views/TitleTextFieldTableViewCell.swift @@ -21,7 +21,7 @@ class TitleTextFieldTableViewCell: UITableViewCell { titleLabel.addGestureRecognizer(tapGestureRecognizer) } - func tap(_ sender: Any?) { + @objc func tap(_ sender: Any?) { contentTextField.becomeFirstResponder() } diff --git a/passExtension/PasscodeExtensionDisplay.swift b/passExtension/PasscodeExtensionDisplay.swift index d6c4fd9..d3a448a 100644 --- a/passExtension/PasscodeExtensionDisplay.swift +++ b/passExtension/PasscodeExtensionDisplay.swift @@ -35,7 +35,7 @@ class PasscodeLockViewControllerForExtension: PasscodeLockViewController { cancelButton?.removeTarget(nil, action: nil, for: .allEvents) cancelButton?.addTarget(self, action: #selector(cancelExtension), for: .touchUpInside) } - func cancelExtension() { + @objc func cancelExtension() { originalExtensionContest?.completeRequest(returningItems: [], completionHandler: nil) } } diff --git a/passKit/Helpers/Utils.swift b/passKit/Helpers/Utils.swift index bc7c625..7767ffb 100644 --- a/passKit/Helpers/Utils.swift +++ b/passKit/Helpers/Utils.swift @@ -111,7 +111,7 @@ public class Utils { } else if !NSCharacterSet.letters.contains(element) { charColor = Globals.blue } - attributedPassword.addAttribute(NSForegroundColorAttributeName, value: charColor, range: NSRange(location: index, length: 1)) + attributedPassword.addAttribute(NSAttributedStringKey.foregroundColor, value: charColor, range: NSRange(location: index, length: 1)) } return attributedPassword } diff --git a/passKit/Models/PasswordStore.swift b/passKit/Models/PasswordStore.swift index b0dbaed..825bd61 100644 --- a/passKit/Models/PasswordStore.swift +++ b/passKit/Models/PasswordStore.swift @@ -727,7 +727,7 @@ public class PasswordStore { let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) privateMOC.parent = context privateMOC.perform { - passwordEntity.image = NSData(data: image) + passwordEntity.image = NSData(data: image) as Data do { try privateMOC.save() self.context.performAndWait { @@ -843,7 +843,7 @@ public class PasswordStore { throw AppError.PGPPublicKeyNotExistError } let plainData = password.getPlainData() - let encryptedData = try pgp.encryptData(plainData, using: publicKey, armored: SharedDefaults[.encryptInArmored]) + let encryptedData = try pgp.encryptData(plainData, using: Array(publicKey), armored: SharedDefaults[.encryptInArmored]) return encryptedData }