Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Swift 4 support
  • Loading branch information
ziogaschr committed Oct 22, 2017
1 parent 1ae3294 commit 6b2ee8f
Show file tree
Hide file tree
Showing 19 changed files with 88 additions and 56 deletions.
43 changes: 30 additions & 13 deletions PasscodeLock.xcodeproj/project.pbxproj
Expand Up @@ -452,28 +452,29 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0700;
LastUpgradeCheck = 0810;
LastUpgradeCheck = 0900;
ORGANIZATIONNAME = "Yanko Dimitrov";
TargetAttributes = {
C99EAF3E1B90B05700D61E1B = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0810;
LastSwiftMigration = 0900;
};
C99EAF481B90B05700D61E1B = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0900;
};
C9D3DF0F1B91AD11008561EB = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0810;
LastSwiftMigration = 0900;
};
C9D3DF221B91AD11008561EB = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0810;
LastSwiftMigration = 0900;
TestTargetID = C9D3DF0F1B91AD11008561EB;
};
C9D3DF2D1B91AD12008561EB = {
CreatedOnToolsVersion = 7.0;
LastSwiftMigration = 0810;
LastSwiftMigration = 0900;
TestTargetID = C9D3DF0F1B91AD11008561EB;
};
};
Expand Down Expand Up @@ -681,14 +682,20 @@
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_EMPTY_BODY = YES;
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;
Expand Down Expand Up @@ -717,6 +724,7 @@
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
Expand All @@ -731,14 +739,20 @@
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_EMPTY_BODY = YES;
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;
Expand All @@ -760,6 +774,7 @@
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
VERSIONING_SYSTEM = "apple-generic";
Expand All @@ -783,7 +798,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
};
name = Debug;
};
Expand All @@ -802,7 +817,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLock;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
};
name = Release;
};
Expand All @@ -816,6 +831,7 @@
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "PasscodeLockTests/PasscodeLockTests-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
Expand All @@ -828,6 +844,7 @@
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "PasscodeLockTests/PasscodeLockTests-Bridging-Header.h";
SWIFT_VERSION = 3.0;
};
name = Release;
};
Expand All @@ -841,7 +858,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
Expand All @@ -856,7 +873,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
Expand All @@ -870,7 +887,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PasscodeLockDemo.app/PasscodeLockDemo";
};
name = Debug;
Expand All @@ -884,7 +901,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemoTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PasscodeLockDemo.app/PasscodeLockDemo";
};
name = Release;
Expand All @@ -897,7 +914,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_TARGET_NAME = PasscodeLockDemo;
USES_XCTRUNNER = YES;
};
Expand All @@ -911,7 +928,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.yankodimitrov.PasscodeLockDemoUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
SWIFT_VERSION = 4.0;
TEST_TARGET_NAME = PasscodeLockDemo;
USES_XCTRUNNER = YES;
};
Expand Down
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0810"
LastUpgradeVersion = "0900"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand All @@ -26,6 +26,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
Expand Down Expand Up @@ -55,6 +56,7 @@
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
language = ""
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
Expand Down
4 changes: 3 additions & 1 deletion PasscodeLock/PasscodeLock/PasscodeLock.swift
Expand Up @@ -44,7 +44,9 @@ open class PasscodeLock: PasscodeLockType {

if passcode.count >= configuration.passcodeLength {

lockState.acceptPasscode(passcode, fromLock: self)
// handles "requires exclusive access" error at Swift 4
var lockStateCopy = lockState
lockStateCopy.acceptPasscode(passcode, fromLock: self)
passcode.removeAll(keepingCapacity: true)
}
}
Expand Down
8 changes: 4 additions & 4 deletions PasscodeLock/PasscodeLockViewController.swift
Expand Up @@ -124,14 +124,14 @@ open class PasscodeLockViewController: UIViewController, PasscodeLockTypeDelegat
notificationCenter?.removeObserver(self, name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
}

open func appWillEnterForegroundHandler(_ notification: Notification) {
@objc open func appWillEnterForegroundHandler(_ notification: Notification) {

if passcodeConfiguration.shouldRequestTouchIDImmediately {
authenticateWithBiometrics()
}
}

open func appDidEnterBackgroundHandler(_ notification: Notification) {
@objc open func appDidEnterBackgroundHandler(_ notification: Notification) {

shouldTryToAuthenticateWithBiometrics = false
}
Expand Down Expand Up @@ -175,7 +175,7 @@ open class PasscodeLockViewController: UIViewController, PasscodeLockTypeDelegat
// if presented as modal
if presentingViewController?.presentedViewController == self {

dismiss(animated: animateOnDismiss, completion: { [weak self] _ in
dismiss(animated: animateOnDismiss, completion: { [weak self] in

self?.dismissCompletionCallback?()

Expand Down Expand Up @@ -246,7 +246,7 @@ open class PasscodeLockViewController: UIViewController, PasscodeLockTypeDelegat

deleteSignButton?.isEnabled = true
animatePlaceholders(placeholders, toState: .inactive)
dismissPasscodeLock(lock, completionHandler: { [weak self] _ in
dismissPasscodeLock(lock, completionHandler: { [weak self] in
self?.successCallback?(lock)
})
}
Expand Down
11 changes: 11 additions & 0 deletions PasscodeLock/Protocols/PasscodeLockConfigurationType.swift
Expand Up @@ -17,3 +17,14 @@ public protocol PasscodeLockConfigurationType {
var touchIdReason: String? {get set}
var maximumInccorectPasscodeAttempts: Int {get}
}

// set configuration optionals
public extension PasscodeLockConfigurationType {
var passcodeLength: Int {
return 4
}

var maximumInccorectPasscodeAttempts: Int {
return -1
}
}
4 changes: 2 additions & 2 deletions PasscodeLock/Views/PasscodeSignButton.swift
Expand Up @@ -75,12 +75,12 @@ open class PasscodeSignButton: UIButton {
addTarget(self, action: #selector(PasscodeSignButton.handleTouchUp), for: [.touchUpInside, .touchDragOutside, .touchCancel])
}

func handleTouchDown() {
@objc func handleTouchDown() {

animateBackgroundColor(highlightBackgroundColor)
}

func handleTouchUp() {
@objc func handleTouchUp() {

animateBackgroundColor(defaultBackgroundColor)
}
Expand Down
6 changes: 3 additions & 3 deletions PasscodeLockDemo/CustomPasscodeLockPresenter.swift
Expand Up @@ -56,7 +56,7 @@ class CustomPasscodeLockPresenter: PasscodeLockPresenter {
notificationCenter.removeObserver(self)
}

dynamic func applicationDidLaunched() -> Void {
@objc dynamic func applicationDidLaunched() -> Void {

// start the Pin Lock presenter
passcodeLockVC.successCallback = { [weak self] _ in
Expand All @@ -68,7 +68,7 @@ class CustomPasscodeLockPresenter: PasscodeLockPresenter {
presentPasscodeLock()
}

dynamic func applicationDidEnterBackground() -> Void {
@objc dynamic func applicationDidEnterBackground() -> Void {

// present PIN lock
presentPasscodeLock()
Expand All @@ -77,7 +77,7 @@ class CustomPasscodeLockPresenter: PasscodeLockPresenter {
addSplashView()
}

dynamic func applicationDidBecomeActive() -> Void {
@objc dynamic func applicationDidBecomeActive() -> Void {

// remove splashView for iOS app background swithcer
removeSplashView()
Expand Down
3 changes: 1 addition & 2 deletions PasscodeLockDemo/PasscodeLockConfiguration.swift
Expand Up @@ -12,10 +12,9 @@ import PasscodeLock
struct PasscodeLockConfiguration: PasscodeLockConfigurationType {

let repository: PasscodeRepositoryType
let passcodeLength = 4
var isTouchIDAllowed = true
let shouldRequestTouchIDImmediately = true
let maximumInccorectPasscodeAttempts = -1
var touchIdReason: String? = nil

init(repository: PasscodeRepositoryType) {

Expand Down
4 changes: 3 additions & 1 deletion PasscodeLockDemo/PasscodeSettingsViewController.swift
Expand Up @@ -63,9 +63,11 @@ class PasscodeSettingsViewController: UIViewController {

passcodeVC = PasscodeLockViewController(state: .removePasscode, configuration: configuration)

passcodeVC.successCallback = { lock in
passcodeVC.successCallback = { [weak self] lock in

lock.repository.deletePasscode()

self?.updatePasscodeView()
}
}

Expand Down
4 changes: 2 additions & 2 deletions PasscodeLockTests/Fakes/FakePasscodeLock.swift
Expand Up @@ -25,15 +25,15 @@ class FakePasscodeLock: PasscodeLockType {
self.configuration = configuration
}

func addSign(sign: String) {
func addSign(_ sign: String) {

}

func removeSign() {

}

func changeStateTo(state: PasscodeLockStateType) {
func changeStateTo(_ state: PasscodeLockStateType) {

lockState = state
changeStateCalled = true
Expand Down
Expand Up @@ -11,7 +11,6 @@ import Foundation
class FakePasscodeLockConfiguration: PasscodeLockConfigurationType {

let repository: PasscodeRepositoryType
let passcodeLength = 4
var isTouchIDAllowed = false
let maximumInccorectPasscodeAttempts = 3
let shouldRequestTouchIDImmediately = false
Expand Down
10 changes: 5 additions & 5 deletions PasscodeLockTests/Fakes/FakePasscodeLockDelegate.swift
Expand Up @@ -10,9 +10,9 @@ import Foundation

class FakePasscodeLockDelegate: PasscodeLockTypeDelegate {

func passcodeLockDidSucceed(lock: PasscodeLockType) {}
func passcodeLockDidFail(lock: PasscodeLockType) {}
func passcodeLockDidChangeState(lock: PasscodeLockType) {}
func passcodeLock(lock: PasscodeLockType, addedSignAtIndex index: Int) {}
func passcodeLock(lock: PasscodeLockType, removedSignAtIndex index: Int) {}
func passcodeLockDidSucceed(_ lock: PasscodeLockType) {}
func passcodeLockDidFail(_ lock: PasscodeLockType) {}
func passcodeLockDidChangeState(_ lock: PasscodeLockType) {}
func passcodeLock(_ lock: PasscodeLockType, addedSignAtIndex index: Int) {}
func passcodeLock(_ lock: PasscodeLockType, removedSignAtIndex index: Int) {}
}
2 changes: 1 addition & 1 deletion PasscodeLockTests/Fakes/FakePasscodeRepository.swift
Expand Up @@ -18,7 +18,7 @@ class FakePasscodeRepository: PasscodeRepositoryType {
var savePasscodeCalled = false
var savedPasscode = [String]()

func savePasscode(passcode: [String]) {
func savePasscode(_ passcode: [String]) {

savePasscodeCalled = true
savedPasscode = passcode
Expand Down

0 comments on commit 6b2ee8f

Please sign in to comment.