diff --git a/SwiftSynchronized.podspec b/SwiftSynchronized.podspec index 8fc6b71..78caf3a 100644 --- a/SwiftSynchronized.podspec +++ b/SwiftSynchronized.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "SwiftSynchronized" - s.version = "1.0.1" + s.version = "1.1.0" s.summary = "Objective-C's @synchronized for Swift, plus performAndWait for NSLock and NSRecursiveLock" s.description = <<-DESC @synchronized for Swift, using calls to the Objective-C runtime and providing nearly identical syntax. Also provides performAndWait extension for NSLock and NSRecursiveLock. diff --git a/SwiftSynchronized.swift b/SwiftSynchronized.swift index 1b42ad7..babf458 100644 --- a/SwiftSynchronized.swift +++ b/SwiftSynchronized.swift @@ -37,7 +37,7 @@ import ObjectiveC /// - lockToken: An Objective-C object to protect the critical section of code /// - action: The critical section of code to be protected /// - Returns: Result of `action()` -public func synchronized(lockToken: AnyObject, @noescape action: () -> ReturnType) -> ReturnType { +public func synchronized(_ lockToken: AnyObject, action: () -> ReturnType) -> ReturnType { return synchronized(lockToken, action: action()) } @@ -48,7 +48,7 @@ public func synchronized(lockToken: AnyObject, @noescape action: () /// - lockToken: An Objective-C object to protect the critical section of code /// - action: The critical section of code to be protected /// - Returns: Result of `action()` -public func synchronized(lockToken: AnyObject, @autoclosure action: () -> ReturnType) -> ReturnType { +public func synchronized(_ lockToken: AnyObject, action: @autoclosure () -> ReturnType) -> ReturnType { defer { objc_sync_exit(lockToken) } objc_sync_enter(lockToken) return action() @@ -63,7 +63,7 @@ public protocol LockPerforming: NSLocking { /// - Parameters: /// - action: The critical section of code to be protected /// - Returns: Result of `action()` - func performAndWait(@noescape action: () -> ReturnType) -> ReturnType + func performAndWait(_ action: () -> ReturnType) -> ReturnType /// Protects `action` using `lock()` and `unlock()`. /// @@ -71,7 +71,7 @@ public protocol LockPerforming: NSLocking { /// - Parameters: /// - action: The critical section of code to be protected /// - Returns: Result of `action()` - func performAndWait(@autoclosure action: () -> ReturnType) -> ReturnType + func performAndWait(_ action: @autoclosure () -> ReturnType) -> ReturnType } extension NSLock: LockPerforming { } @@ -81,14 +81,14 @@ public extension LockPerforming { /// Protects `action` using `lock()` and `unlock()`. /// /// - SeeAlso: `LockPerforming` protocol - func performAndWait(@noescape action: () -> ReturnType) -> ReturnType { + func performAndWait(_ action: () -> ReturnType) -> ReturnType { return performAndWait(action()) } /// Protects `action` using `lock()` and `unlock()`. /// /// - SeeAlso: `LockPerforming` protocol - func performAndWait(@autoclosure action: () -> ReturnType) -> ReturnType { + func performAndWait(_ action: @autoclosure () -> ReturnType) -> ReturnType { defer { unlock() } lock() return action() diff --git a/SwiftSynchronized.xcodeproj/project.pbxproj b/SwiftSynchronized.xcodeproj/project.pbxproj index 4821c8e..5728478 100644 --- a/SwiftSynchronized.xcodeproj/project.pbxproj +++ b/SwiftSynchronized.xcodeproj/project.pbxproj @@ -158,9 +158,11 @@ TargetAttributes = { 8590CDA11B93B67D00AE74E1 = { CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 0800; }; 8590CDAB1B93B67D00AE74E1 = { CreatedOnToolsVersion = 7.0; + LastSwiftMigration = 0800; }; }; }; @@ -332,6 +334,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -349,6 +352,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.magicappfactory.SwiftSynchronized; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -359,6 +363,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.magicappfactory.SwiftSynchronizedTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -369,6 +374,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.magicappfactory.SwiftSynchronizedTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; }; name = Release; }; diff --git a/SwiftSynchronizedTests/SwiftSynchronizedAutoClosureTests.swift b/SwiftSynchronizedTests/SwiftSynchronizedAutoClosureTests.swift index 66a2813..6906bb7 100644 --- a/SwiftSynchronizedTests/SwiftSynchronizedAutoClosureTests.swift +++ b/SwiftSynchronizedTests/SwiftSynchronizedAutoClosureTests.swift @@ -30,12 +30,12 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { // it hasn't been incremented by another operation (when the counter isn't one) func incrementCounter() { - counter++ + counter += 1 } func decrementCounterIfPossible() { if counter == 1 { - counter-- + counter -= 1 } else { // Another operation has incremented the counter before we got a chance to decrement it } @@ -54,16 +54,16 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { func testWithSwiftSynchronizedAutoclosureExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { + let blockOperation = BlockOperation() { synchronized(self, action: self.performOperation()) } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) @@ -75,17 +75,19 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { func testWithSwiftLockExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() let lock = NSLock() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { - lock.performAndWait { self.performOperation() } + let blockOperation = BlockOperation { + lock.performAndWait { _ in + self.performOperation() + } } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) @@ -96,17 +98,19 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { func testWithSwiftRecursiveLockExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() let lock = NSRecursiveLock() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { - lock.performAndWait { self.performOperation() } + let blockOperation = BlockOperation { + lock.performAndWait { _ in + self.performOperation() + } } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) @@ -118,17 +122,17 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { func testWithSwiftLockAutoclosureExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() let lock = NSLock() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { - lock.performAndWait(self.performOperation()) + let blockOperation = BlockOperation { + lock.performAndWait( self.performOperation()) } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) @@ -139,17 +143,17 @@ class SwiftSynchronizedAutoClosureTests: XCTestCase { func testWithSwiftRecursiveLockAutoclosureExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() let lock = NSRecursiveLock() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { + let blockOperation = BlockOperation() { lock.performAndWait(self.performOperation()) } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) diff --git a/SwiftSynchronizedTests/SwiftSynchronizedTests.swift b/SwiftSynchronizedTests/SwiftSynchronizedTests.swift index 476af5e..25bfb6c 100644 --- a/SwiftSynchronizedTests/SwiftSynchronizedTests.swift +++ b/SwiftSynchronizedTests/SwiftSynchronizedTests.swift @@ -30,12 +30,12 @@ class SwiftSynchronizedTests: XCTestCase { // it hasn't been incremented by another operation (when the counter isn't one) func incrementCounter() { - counter++ + counter += 1 } func decrementCounterIfPossible() { if counter == 1 { - counter-- + counter -= 1 } else { // Another operation has incremented the counter before we got a chance to decrement it } @@ -50,16 +50,16 @@ class SwiftSynchronizedTests: XCTestCase { func testWithoutSwiftSynchronized() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { + let blockOperation = BlockOperation() { self.performOperation() } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) print(counter) @@ -72,18 +72,18 @@ class SwiftSynchronizedTests: XCTestCase { func testWithSwiftSynchronizedExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { - synchronized(self) { + let blockOperation = BlockOperation { + synchronized(self) { _ in self.performOperation() } } blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true) @@ -94,12 +94,12 @@ class SwiftSynchronizedTests: XCTestCase { func testtestWithSwiftSynchronizedReturnExample() { - var blockOps = [NSBlockOperation]() + var blockOps = [BlockOperation]() var localcounter = 0 for _ in 0...blockOpCount { - let blockOperation = NSBlockOperation() { + let blockOperation = BlockOperation() { localcounter = synchronized(self) { self.performOperation() return self.counter @@ -108,7 +108,7 @@ class SwiftSynchronizedTests: XCTestCase { blockOps.append(blockOperation) } - let operationQ = NSOperationQueue() + let operationQ = OperationQueue() operationQ.addOperations(blockOps, waitUntilFinished: true)