├── .gitignore ├── .swift-version ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── Package.swift ├── README.md ├── Sources ├── Info.plist ├── SwiftyTimer.h └── SwiftyTimer.swift ├── SwiftyTimer.podspec ├── SwiftyTimer.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── SwiftyTimer OS X.xcscheme │ ├── SwiftyTimer tvOS.xcscheme │ ├── SwiftyTimer watchOS.xcscheme │ └── SwiftyTimer.xcscheme └── SwiftyTimerTests ├── SwiftyTimerTests.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ └── SwiftyTimerTests.xcscheme └── SwiftyTimerTests ├── Info.plist └── main.swift /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.swp 3 | *~.nib 4 | 5 | /build/ 6 | .project 7 | *.mode1 8 | *.mode1v3 9 | *.mode2v3 10 | *.perspective 11 | *.perspectivev3 12 | *.pbxuser 13 | xcuserdata/ 14 | *.xcuserstate 15 | *.xccheckout 16 | /Build/ 17 | /DerivedData/ 18 | 19 | /Pods/ 20 | 21 | /www 22 | 23 | # Carthage 24 | Carthage/ 25 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.2 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | rvm: 2.4.2 3 | osx_image: xcode10 4 | 5 | env: 6 | global: 7 | - LC_CTYPE=en_US.UTF-8 8 | - LANG=en_US.UTF-8 9 | - PROJECT=SwiftyTimer.xcodeproj 10 | 11 | before_install: 12 | - gem install cocoapods 13 | - gem install xcpretty 14 | 15 | script: 16 | - set -o pipefail 17 | - xcodebuild -version 18 | - xcodebuild -showsdks 19 | 20 | - xcodebuild -project "$PROJECT" -scheme 'SwiftyTimer' -destination 'name=iPhone 6,OS=10.0' ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO build | xcpretty 21 | - xcodebuild -project "$PROJECT" -scheme 'SwiftyTimer tvOS' -sdk appletvsimulator12.0 -destination 'name=Apple TV' ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO build | xcpretty 22 | - xcodebuild -project "$PROJECT" -scheme 'SwiftyTimer watchOS' -sdk iphonesimulator -destination 'name=Apple Watch - 42mm' ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO build | xcpretty 23 | - xcodebuild -project "$PROJECT" -scheme 'SwiftyTimer OS X' ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO build | xcpretty 24 | 25 | - xcodebuild -archivePath 'Tests' -project SwiftyTimerTests/SwiftyTimerTests.xcodeproj -scheme 'SwiftyTimerTests' archive && Tests.xcarchive/Products/Applications/SwiftyTimerTests.app/Contents/MacOS/SwiftyTimerTests 26 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 2.1.0 (2018-10-14) 2 | 3 | This version supports Swift 4.2 without introducing changes to the library workflow. 4 | Library source modifications include adopting new changes in the `RunLoopMode` enum introduced in Swift 4.2 5 | - Updated for Swift 4.2 and Xcode 10 #45 @asowers1 6 | 7 | ### 2.0.0 (2016-09-23) 8 | 9 | This is the Swift 3 update version. 10 | 11 | It contains no major changes in the library itself, however it does change some APIs because of Swift 3 requirements. 12 | 13 | - Updated for Swift 3 and Xcode 8 compatibility #28 @ldiqual 14 | 15 | ### 1.4.1 (2016-08-03) 16 | 17 | - Add support for Xcode 8 (Swift 2.3) for Carthage users 18 | 19 | ### 1.4.0 (2016-04-10) 20 | 21 | - Add a variant of `every` and `new(every:)` that takes a closure with `NSTimer` passed in 22 | - Fix Carthage support for Mac (set deployment target to 10.9) 23 | 24 | ### 1.3.1 (2016-03-02) 25 | 26 | - Added support for Swift Package Manager 27 | - Refactoring (Removed NSTimerActor. Used CFRunLoopTimerCreateWithHandler instead.) #22 @Austinate 28 | - Added Travis CI 29 | 30 | ### 1.3.0 (2016-02-29) 31 | 32 | - Add Carthage support 33 | - Add tvOS and watchOS support 34 | 35 | ### 1.2.0 (2015-09-18) 36 | 37 | - Update to Swift 2 38 | - Add millisecond helper (`100.ms`) 39 | 40 | ### 1.1.0 (2015-05-13) 41 | 42 | - Add `start(runLoop:, modes:)` 43 | - Refactoring 44 | 45 | ### 1.0.0 (2015-05-11) 46 | 47 | - Initial release 48 | - `NSTimer.after(...)` and `NSTimer.every(...)` 49 | - `NSTimer.new` 50 | - Ruby on Rails-inspired time helpers like (5.seconds or 1.minute) 51 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 Radosław Pietruszewski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "SwiftyTimer", 5 | dependencies: [], 6 | exclude: ["Sources/Info.plist", "Sources/SwiftyTimer.h", "SwiftyTimerTests"] 7 | 8 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwiftyTimer 2 | 3 | ![Platforms](https://img.shields.io/badge/platforms-ios%20%7C%20osx%20%7C%20watchos%20%7C%20tvos-lightgrey.svg) 4 | [![CI Status](https://api.travis-ci.org/radex/SwiftyTimer.svg?branch=master)](https://travis-ci.org/radex/SwiftyTimer) 5 | [![CocoaPods](http://img.shields.io/cocoapods/v/SwiftyTimer.svg)](https://cocoapods.org/pods/SwiftyTimer) 6 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](#carthage) 7 | ![Swift version](https://img.shields.io/badge/swift-4.2-orange.svg) 8 | 9 | #### Modern Swifty API for `NSTimer` 10 | ###### SwiftyTimer allows you to instantly schedule delays and repeating timers using convenient closure syntax. It's time to get rid of Objective-C cruft. 11 | 12 | Read [Swifty APIs: NSTimer](http://radex.io/swift/nstimer/) for more information about this project. 13 | 14 | ## Usage 15 | 16 | You can easily schedule repeating and non-repeating timers (repeats and delays) using `Timer.every` and `Timer.after`: 17 | 18 | ```swift 19 | Timer.every(0.7.seconds) { 20 | statusItem.blink() 21 | } 22 | 23 | Timer.after(1.minute) { 24 | println("Are you still here?") 25 | } 26 | ``` 27 | 28 | You can specify time intervals with these intuitive helpers: 29 | 30 | ```swift 31 | 100.ms 32 | 1.second 33 | 2.5.seconds 34 | 5.seconds 35 | 10.minutes 36 | 1.hour 37 | 2.days 38 | ``` 39 | 40 | You can pass method references instead of closures: 41 | 42 | ```swift 43 | Timer.every(30.seconds, align) 44 | ``` 45 | 46 | ### Manual scheduling 47 | 48 | If you want to make a timer object without scheduling, use `new(after:)` and `new(every:)`: 49 | 50 | ```swift 51 | let timer = Timer.new(every: 1.second) { 52 | println(self.status) 53 | } 54 | ``` 55 | 56 | (This should be defined as an initializer, but [a bug in Foundation](http://www.openradar.me/18720947) prevents this) 57 | 58 | Call `start()` to schedule timers created using `new`. You can optionally pass the run loop and run loop modes: 59 | 60 | ```swift 61 | timer.start() 62 | timer.start(modes: .defaultRunLoopMode, .eventTrackingRunLoopMode) 63 | ``` 64 | 65 | ### Invalidation 66 | 67 | If you want to invalidate a repeating timer on some condition, you can take a `Timer` argument in the closure you pass in: 68 | 69 | ```swift 70 | Timer.every(5.seconds) { (timer: Timer) in 71 | // do something 72 | 73 | if finished { 74 | timer.invalidate() 75 | } 76 | } 77 | ``` 78 | 79 | ## Installation 80 | 81 | **Note:** If you're running Swift 2, use [SwiftyTimer v1.4.1](https://github.com/radex/SwiftyTimer/tree/1.4.1) 82 | 83 | #### CocoaPods 84 | 85 | If you're using CocoaPods, just add this line to your Podfile: 86 | 87 | ```ruby 88 | pod 'SwiftyTimer' 89 | ``` 90 | 91 | Install by running this command in your terminal: 92 | 93 | ```sh 94 | pod install 95 | ``` 96 | 97 | Then import the library in all files where you use it: 98 | 99 | ```swift 100 | import SwiftyTimer 101 | ``` 102 | 103 | #### Carthage 104 | 105 | Just add to your Cartfile: 106 | 107 | ```ruby 108 | github "radex/SwiftyTimer" 109 | ``` 110 | 111 | #### Manually 112 | 113 | Simply copy `Sources/SwiftyTimer.swift` to your Xcode project. 114 | 115 | ## More like this 116 | 117 | If you like SwiftyTimer, check out [SwiftyUserDefaults](https://github.com/radex/SwiftyUserDefaults), which applies the same swifty approach to `NSUserDefaults`. 118 | 119 | You might also be interested in my blog posts which explain the design process behind those libraries: 120 | - [Swifty APIs: NSTimer](http://radex.io/swift/nstimer/) 121 | - [Swifty APIs: NSUserDefaults](http://radex.io/swift/nsuserdefaults/) 122 | - [Statically-typed NSUserDefaults](http://radex.io/swift/nsuserdefaults/static) 123 | - [Swifty methods](http://radex.io/swift/methods/) 124 | 125 | ### Contributing 126 | 127 | If you have comments, complaints or ideas for improvements, feel free to open an issue or a pull request. 128 | 129 | ### Author and license 130 | 131 | Radek Pietruszewski 132 | 133 | * [github.com/radex](http://github.com/radex) 134 | * [twitter.com/radexp](http://twitter.com/radexp) 135 | * [radex.io](http://radex.io) 136 | * this.is@radex.io 137 | 138 | SwiftyTimer is available under the MIT license. See the LICENSE file for more info. 139 | -------------------------------------------------------------------------------- /Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Sources/SwiftyTimer.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | FOUNDATION_EXPORT double SwiftyTimerVersionNumber; 4 | FOUNDATION_EXPORT const unsigned char SwiftyTimerVersionString[]; -------------------------------------------------------------------------------- /Sources/SwiftyTimer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyTimer 3 | // 4 | // Copyright (c) 2015-2016 Radosław Pietruszewski 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | extension Timer { 28 | 29 | // MARK: Schedule timers 30 | 31 | /// Create and schedule a timer that will call `block` once after the specified time. 32 | 33 | @discardableResult 34 | public class func after(_ interval: TimeInterval, _ block: @escaping () -> Void) -> Timer { 35 | let timer = Timer.new(after: interval, block) 36 | timer.start() 37 | return timer 38 | } 39 | 40 | /// Create and schedule a timer that will call `block` repeatedly in specified time intervals. 41 | 42 | @discardableResult 43 | public class func every(_ interval: TimeInterval, _ block: @escaping () -> Void) -> Timer { 44 | let timer = Timer.new(every: interval, block) 45 | timer.start() 46 | return timer 47 | } 48 | 49 | /// Create and schedule a timer that will call `block` repeatedly in specified time intervals. 50 | /// (This variant also passes the timer instance to the block) 51 | 52 | @nonobjc @discardableResult 53 | public class func every(_ interval: TimeInterval, _ block: @escaping (Timer) -> Void) -> Timer { 54 | let timer = Timer.new(every: interval, block) 55 | timer.start() 56 | return timer 57 | } 58 | 59 | // MARK: Create timers without scheduling 60 | 61 | /// Create a timer that will call `block` once after the specified time. 62 | /// 63 | /// - Note: The timer won't fire until it's scheduled on the run loop. 64 | /// Use `NSTimer.after` to create and schedule a timer in one step. 65 | /// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947) 66 | 67 | public class func new(after interval: TimeInterval, _ block: @escaping () -> Void) -> Timer { 68 | return CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, 0, 0, 0) { _ in 69 | block() 70 | } 71 | } 72 | 73 | /// Create a timer that will call `block` repeatedly in specified time intervals. 74 | /// 75 | /// - Note: The timer won't fire until it's scheduled on the run loop. 76 | /// Use `NSTimer.every` to create and schedule a timer in one step. 77 | /// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947) 78 | 79 | public class func new(every interval: TimeInterval, _ block: @escaping () -> Void) -> Timer { 80 | return CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0) { _ in 81 | block() 82 | } 83 | } 84 | 85 | /// Create a timer that will call `block` repeatedly in specified time intervals. 86 | /// (This variant also passes the timer instance to the block) 87 | /// 88 | /// - Note: The timer won't fire until it's scheduled on the run loop. 89 | /// Use `NSTimer.every` to create and schedule a timer in one step. 90 | /// - Note: The `new` class function is a workaround for a crashing bug when using convenience initializers (rdar://18720947) 91 | 92 | @nonobjc public class func new(every interval: TimeInterval, _ block: @escaping (Timer) -> Void) -> Timer { 93 | var timer: Timer! 94 | timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0) { _ in 95 | block(timer) 96 | } 97 | return timer 98 | } 99 | 100 | // MARK: Manual scheduling 101 | 102 | /// Schedule this timer on the run loop 103 | /// 104 | /// By default, the timer is scheduled on the current run loop for the default mode. 105 | /// Specify `runLoop` or `modes` to override these defaults. 106 | 107 | public func start(runLoop: RunLoop = .current, modes: RunLoop.Mode...) { 108 | let modes = modes.isEmpty ? [.default] : modes 109 | 110 | for mode in modes { 111 | runLoop.add(self, forMode: mode) 112 | } 113 | } 114 | } 115 | 116 | // MARK: - Time extensions 117 | 118 | extension Double { 119 | public var millisecond: TimeInterval { return self / 1000 } 120 | public var milliseconds: TimeInterval { return self / 1000 } 121 | public var ms: TimeInterval { return self / 1000 } 122 | 123 | public var second: TimeInterval { return self } 124 | public var seconds: TimeInterval { return self } 125 | 126 | public var minute: TimeInterval { return self * 60 } 127 | public var minutes: TimeInterval { return self * 60 } 128 | 129 | public var hour: TimeInterval { return self * 3600 } 130 | public var hours: TimeInterval { return self * 3600 } 131 | 132 | public var day: TimeInterval { return self * 3600 * 24 } 133 | public var days: TimeInterval { return self * 3600 * 24 } 134 | } 135 | -------------------------------------------------------------------------------- /SwiftyTimer.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'SwiftyTimer' 3 | s.version = '2.1.0' 4 | s.license = 'MIT' 5 | s.summary = 'Swifty API for NSTimer' 6 | s.homepage = 'https://github.com/radex/SwiftyTimer' 7 | s.authors = { 'Radek Pietruszewski' => 'this.is@radex.io' } 8 | s.source = { git: 'https://github.com/radex/SwiftyTimer.git', tag: s.version } 9 | s.swift_version = '4.2' 10 | s.requires_arc = true 11 | s.ios.deployment_target = '8.0' 12 | s.osx.deployment_target = '10.9' 13 | s.tvos.deployment_target = '9.0' 14 | s.watchos.deployment_target = '2.0' 15 | 16 | s.source_files = 'Sources/*.swift' 17 | end 18 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3E721AC71BF725A2008AF027 /* SwiftyTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */; }; 11 | 6E7E40931C84B2C60030CEBB /* SwiftyTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 6E7E40941C84B2C70030CEBB /* SwiftyTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 6E7E40A21C84B3F40030CEBB /* SwiftyTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 6E7E40B01C84B43A0030CEBB /* SwiftyTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 6E7E40B11C84B4B40030CEBB /* SwiftyTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */; }; 16 | 6E7E40B21C84B4B40030CEBB /* SwiftyTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */; }; 17 | 6E7E40B31C84B4B40030CEBB /* SwiftyTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 3E721ABB1BF7255D008AF027 /* SwiftyTimer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyTimer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | 3E721AC01BF7255D008AF027 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 23 | 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftyTimer.swift; sourceTree = ""; }; 24 | 6E7E408A1C84B1A20030CEBB /* SwiftyTimer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyTimer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 25 | 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyTimer.h; sourceTree = ""; }; 26 | 6E7E409A1C84B3790030CEBB /* SwiftyTimer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyTimer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | 6E7E40A81C84B4240030CEBB /* SwiftyTimer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyTimer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | 3E721AB71BF7255D008AF027 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | 6E7E40861C84B1A20030CEBB /* Frameworks */ = { 39 | isa = PBXFrameworksBuildPhase; 40 | buildActionMask = 2147483647; 41 | files = ( 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | 6E7E40961C84B3790030CEBB /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | 6E7E40A41C84B4240030CEBB /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXFrameworksBuildPhase section */ 60 | 61 | /* Begin PBXGroup section */ 62 | 3E721AB11BF7255C008AF027 = { 63 | isa = PBXGroup; 64 | children = ( 65 | 3E721ABD1BF7255D008AF027 /* SwiftyTimer */, 66 | 3E721ABC1BF7255D008AF027 /* Products */, 67 | ); 68 | sourceTree = ""; 69 | }; 70 | 3E721ABC1BF7255D008AF027 /* Products */ = { 71 | isa = PBXGroup; 72 | children = ( 73 | 3E721ABB1BF7255D008AF027 /* SwiftyTimer.framework */, 74 | 6E7E408A1C84B1A20030CEBB /* SwiftyTimer.framework */, 75 | 6E7E409A1C84B3790030CEBB /* SwiftyTimer.framework */, 76 | 6E7E40A81C84B4240030CEBB /* SwiftyTimer.framework */, 77 | ); 78 | name = Products; 79 | sourceTree = ""; 80 | }; 81 | 3E721ABD1BF7255D008AF027 /* SwiftyTimer */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 3E721AC61BF725A2008AF027 /* SwiftyTimer.swift */, 85 | 3E721AC01BF7255D008AF027 /* Info.plist */, 86 | 6E7E40921C84B2970030CEBB /* SwiftyTimer.h */, 87 | ); 88 | name = SwiftyTimer; 89 | path = Sources; 90 | sourceTree = ""; 91 | }; 92 | /* End PBXGroup section */ 93 | 94 | /* Begin PBXHeadersBuildPhase section */ 95 | 3E721AB81BF7255D008AF027 /* Headers */ = { 96 | isa = PBXHeadersBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | 6E7E40931C84B2C60030CEBB /* SwiftyTimer.h in Headers */, 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | 6E7E40871C84B1A20030CEBB /* Headers */ = { 104 | isa = PBXHeadersBuildPhase; 105 | buildActionMask = 2147483647; 106 | files = ( 107 | 6E7E40941C84B2C70030CEBB /* SwiftyTimer.h in Headers */, 108 | ); 109 | runOnlyForDeploymentPostprocessing = 0; 110 | }; 111 | 6E7E40971C84B3790030CEBB /* Headers */ = { 112 | isa = PBXHeadersBuildPhase; 113 | buildActionMask = 2147483647; 114 | files = ( 115 | 6E7E40A21C84B3F40030CEBB /* SwiftyTimer.h in Headers */, 116 | ); 117 | runOnlyForDeploymentPostprocessing = 0; 118 | }; 119 | 6E7E40A51C84B4240030CEBB /* Headers */ = { 120 | isa = PBXHeadersBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | 6E7E40B01C84B43A0030CEBB /* SwiftyTimer.h in Headers */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXHeadersBuildPhase section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | 3E721ABA1BF7255D008AF027 /* SwiftyTimer */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = 3E721AC31BF7255D008AF027 /* Build configuration list for PBXNativeTarget "SwiftyTimer" */; 133 | buildPhases = ( 134 | 3E721AB61BF7255D008AF027 /* Sources */, 135 | 3E721AB71BF7255D008AF027 /* Frameworks */, 136 | 3E721AB81BF7255D008AF027 /* Headers */, 137 | 3E721AB91BF7255D008AF027 /* Resources */, 138 | ); 139 | buildRules = ( 140 | ); 141 | dependencies = ( 142 | ); 143 | name = SwiftyTimer; 144 | productName = SwiftyTimer; 145 | productReference = 3E721ABB1BF7255D008AF027 /* SwiftyTimer.framework */; 146 | productType = "com.apple.product-type.framework"; 147 | }; 148 | 6E7E40891C84B1A20030CEBB /* SwiftyTimer OS X */ = { 149 | isa = PBXNativeTarget; 150 | buildConfigurationList = 6E7E408F1C84B1A20030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer OS X" */; 151 | buildPhases = ( 152 | 6E7E40851C84B1A20030CEBB /* Sources */, 153 | 6E7E40861C84B1A20030CEBB /* Frameworks */, 154 | 6E7E40871C84B1A20030CEBB /* Headers */, 155 | 6E7E40881C84B1A20030CEBB /* Resources */, 156 | ); 157 | buildRules = ( 158 | ); 159 | dependencies = ( 160 | ); 161 | name = "SwiftyTimer OS X"; 162 | productName = SwiftyTimerMac; 163 | productReference = 6E7E408A1C84B1A20030CEBB /* SwiftyTimer.framework */; 164 | productType = "com.apple.product-type.framework"; 165 | }; 166 | 6E7E40991C84B3790030CEBB /* SwiftyTimer tvOS */ = { 167 | isa = PBXNativeTarget; 168 | buildConfigurationList = 6E7E409F1C84B3790030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer tvOS" */; 169 | buildPhases = ( 170 | 6E7E40951C84B3790030CEBB /* Sources */, 171 | 6E7E40961C84B3790030CEBB /* Frameworks */, 172 | 6E7E40971C84B3790030CEBB /* Headers */, 173 | 6E7E40981C84B3790030CEBB /* Resources */, 174 | ); 175 | buildRules = ( 176 | ); 177 | dependencies = ( 178 | ); 179 | name = "SwiftyTimer tvOS"; 180 | productName = "SwiftyTimer tvOS"; 181 | productReference = 6E7E409A1C84B3790030CEBB /* SwiftyTimer.framework */; 182 | productType = "com.apple.product-type.framework"; 183 | }; 184 | 6E7E40A71C84B4240030CEBB /* SwiftyTimer watchOS */ = { 185 | isa = PBXNativeTarget; 186 | buildConfigurationList = 6E7E40AD1C84B4240030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer watchOS" */; 187 | buildPhases = ( 188 | 6E7E40A31C84B4240030CEBB /* Sources */, 189 | 6E7E40A41C84B4240030CEBB /* Frameworks */, 190 | 6E7E40A51C84B4240030CEBB /* Headers */, 191 | 6E7E40A61C84B4240030CEBB /* Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | ); 197 | name = "SwiftyTimer watchOS"; 198 | productName = "SwiftyTimer watchOS"; 199 | productReference = 6E7E40A81C84B4240030CEBB /* SwiftyTimer.framework */; 200 | productType = "com.apple.product-type.framework"; 201 | }; 202 | /* End PBXNativeTarget section */ 203 | 204 | /* Begin PBXProject section */ 205 | 3E721AB21BF7255C008AF027 /* Project object */ = { 206 | isa = PBXProject; 207 | attributes = { 208 | LastUpgradeCheck = 1000; 209 | ORGANIZATIONNAME = "Radosław Pietruszewski"; 210 | TargetAttributes = { 211 | 3E721ABA1BF7255D008AF027 = { 212 | CreatedOnToolsVersion = 7.1; 213 | LastSwiftMigration = 0800; 214 | }; 215 | 6E7E40891C84B1A20030CEBB = { 216 | CreatedOnToolsVersion = 7.2; 217 | }; 218 | 6E7E40991C84B3790030CEBB = { 219 | CreatedOnToolsVersion = 7.2; 220 | }; 221 | 6E7E40A71C84B4240030CEBB = { 222 | CreatedOnToolsVersion = 7.2; 223 | }; 224 | }; 225 | }; 226 | buildConfigurationList = 3E721AB51BF7255C008AF027 /* Build configuration list for PBXProject "SwiftyTimer" */; 227 | compatibilityVersion = "Xcode 3.2"; 228 | developmentRegion = English; 229 | hasScannedForEncodings = 0; 230 | knownRegions = ( 231 | en, 232 | ); 233 | mainGroup = 3E721AB11BF7255C008AF027; 234 | productRefGroup = 3E721ABC1BF7255D008AF027 /* Products */; 235 | projectDirPath = ""; 236 | projectRoot = ""; 237 | targets = ( 238 | 3E721ABA1BF7255D008AF027 /* SwiftyTimer */, 239 | 6E7E40891C84B1A20030CEBB /* SwiftyTimer OS X */, 240 | 6E7E40991C84B3790030CEBB /* SwiftyTimer tvOS */, 241 | 6E7E40A71C84B4240030CEBB /* SwiftyTimer watchOS */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 3E721AB91BF7255D008AF027 /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | 6E7E40881C84B1A20030CEBB /* Resources */ = { 255 | isa = PBXResourcesBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | }; 261 | 6E7E40981C84B3790030CEBB /* Resources */ = { 262 | isa = PBXResourcesBuildPhase; 263 | buildActionMask = 2147483647; 264 | files = ( 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | 6E7E40A61C84B4240030CEBB /* Resources */ = { 269 | isa = PBXResourcesBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | ); 273 | runOnlyForDeploymentPostprocessing = 0; 274 | }; 275 | /* End PBXResourcesBuildPhase section */ 276 | 277 | /* Begin PBXSourcesBuildPhase section */ 278 | 3E721AB61BF7255D008AF027 /* Sources */ = { 279 | isa = PBXSourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | 3E721AC71BF725A2008AF027 /* SwiftyTimer.swift in Sources */, 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | }; 286 | 6E7E40851C84B1A20030CEBB /* Sources */ = { 287 | isa = PBXSourcesBuildPhase; 288 | buildActionMask = 2147483647; 289 | files = ( 290 | 6E7E40B11C84B4B40030CEBB /* SwiftyTimer.swift in Sources */, 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | 6E7E40951C84B3790030CEBB /* Sources */ = { 295 | isa = PBXSourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | 6E7E40B21C84B4B40030CEBB /* SwiftyTimer.swift in Sources */, 299 | ); 300 | runOnlyForDeploymentPostprocessing = 0; 301 | }; 302 | 6E7E40A31C84B4240030CEBB /* Sources */ = { 303 | isa = PBXSourcesBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | 6E7E40B31C84B4B40030CEBB /* SwiftyTimer.swift in Sources */, 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | /* End PBXSourcesBuildPhase section */ 311 | 312 | /* Begin XCBuildConfiguration section */ 313 | 3E721AC11BF7255D008AF027 /* Debug */ = { 314 | isa = XCBuildConfiguration; 315 | buildSettings = { 316 | ALWAYS_SEARCH_USER_PATHS = NO; 317 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 318 | CLANG_CXX_LIBRARY = "libc++"; 319 | CLANG_ENABLE_MODULES = YES; 320 | CLANG_ENABLE_OBJC_ARC = YES; 321 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 322 | CLANG_WARN_BOOL_CONVERSION = YES; 323 | CLANG_WARN_COMMA = YES; 324 | CLANG_WARN_CONSTANT_CONVERSION = YES; 325 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 326 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 327 | CLANG_WARN_EMPTY_BODY = YES; 328 | CLANG_WARN_ENUM_CONVERSION = YES; 329 | CLANG_WARN_INFINITE_RECURSION = YES; 330 | CLANG_WARN_INT_CONVERSION = YES; 331 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 332 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 333 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 334 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 335 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 336 | CLANG_WARN_STRICT_PROTOTYPES = YES; 337 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 338 | CLANG_WARN_UNREACHABLE_CODE = YES; 339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 340 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 341 | COPY_PHASE_STRIP = NO; 342 | CURRENT_PROJECT_VERSION = 1; 343 | DEBUG_INFORMATION_FORMAT = dwarf; 344 | ENABLE_STRICT_OBJC_MSGSEND = YES; 345 | ENABLE_TESTABILITY = YES; 346 | GCC_C_LANGUAGE_STANDARD = gnu99; 347 | GCC_DYNAMIC_NO_PIC = NO; 348 | GCC_NO_COMMON_BLOCKS = YES; 349 | GCC_OPTIMIZATION_LEVEL = 0; 350 | GCC_PREPROCESSOR_DEFINITIONS = ( 351 | "DEBUG=1", 352 | "$(inherited)", 353 | ); 354 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 355 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 356 | GCC_WARN_UNDECLARED_SELECTOR = YES; 357 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 358 | GCC_WARN_UNUSED_FUNCTION = YES; 359 | GCC_WARN_UNUSED_VARIABLE = YES; 360 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 361 | MACOSX_DEPLOYMENT_TARGET = 10.9; 362 | MTL_ENABLE_DEBUG_INFO = YES; 363 | ONLY_ACTIVE_ARCH = YES; 364 | SDKROOT = iphoneos; 365 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 366 | SWIFT_VERSION = 4.2; 367 | TARGETED_DEVICE_FAMILY = "1,2"; 368 | VERSIONING_SYSTEM = "apple-generic"; 369 | VERSION_INFO_PREFIX = ""; 370 | }; 371 | name = Debug; 372 | }; 373 | 3E721AC21BF7255D008AF027 /* Release */ = { 374 | isa = XCBuildConfiguration; 375 | buildSettings = { 376 | ALWAYS_SEARCH_USER_PATHS = NO; 377 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 378 | CLANG_CXX_LIBRARY = "libc++"; 379 | CLANG_ENABLE_MODULES = YES; 380 | CLANG_ENABLE_OBJC_ARC = YES; 381 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 382 | CLANG_WARN_BOOL_CONVERSION = YES; 383 | CLANG_WARN_COMMA = YES; 384 | CLANG_WARN_CONSTANT_CONVERSION = YES; 385 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 386 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 387 | CLANG_WARN_EMPTY_BODY = YES; 388 | CLANG_WARN_ENUM_CONVERSION = YES; 389 | CLANG_WARN_INFINITE_RECURSION = YES; 390 | CLANG_WARN_INT_CONVERSION = YES; 391 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 392 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 393 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 394 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 395 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 396 | CLANG_WARN_STRICT_PROTOTYPES = YES; 397 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 398 | CLANG_WARN_UNREACHABLE_CODE = YES; 399 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 400 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 401 | COPY_PHASE_STRIP = NO; 402 | CURRENT_PROJECT_VERSION = 1; 403 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 404 | ENABLE_NS_ASSERTIONS = NO; 405 | ENABLE_STRICT_OBJC_MSGSEND = YES; 406 | GCC_C_LANGUAGE_STANDARD = gnu99; 407 | GCC_NO_COMMON_BLOCKS = YES; 408 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 409 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 410 | GCC_WARN_UNDECLARED_SELECTOR = YES; 411 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 412 | GCC_WARN_UNUSED_FUNCTION = YES; 413 | GCC_WARN_UNUSED_VARIABLE = YES; 414 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 415 | MACOSX_DEPLOYMENT_TARGET = 10.9; 416 | MTL_ENABLE_DEBUG_INFO = NO; 417 | SDKROOT = iphoneos; 418 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 419 | SWIFT_VERSION = 4.2; 420 | TARGETED_DEVICE_FAMILY = "1,2"; 421 | VALIDATE_PRODUCT = YES; 422 | VERSIONING_SYSTEM = "apple-generic"; 423 | VERSION_INFO_PREFIX = ""; 424 | }; 425 | name = Release; 426 | }; 427 | 3E721AC41BF7255D008AF027 /* Debug */ = { 428 | isa = XCBuildConfiguration; 429 | buildSettings = { 430 | APPLICATION_EXTENSION_API_ONLY = YES; 431 | CLANG_ENABLE_MODULES = YES; 432 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 433 | DEFINES_MODULE = YES; 434 | DYLIB_COMPATIBILITY_VERSION = 1; 435 | DYLIB_CURRENT_VERSION = 1; 436 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 437 | INFOPLIST_FILE = Sources/Info.plist; 438 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 439 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 440 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 441 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | SKIP_INSTALL = YES; 444 | SWIFT_VERSION = 4.2; 445 | }; 446 | name = Debug; 447 | }; 448 | 3E721AC51BF7255D008AF027 /* Release */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | APPLICATION_EXTENSION_API_ONLY = YES; 452 | CLANG_ENABLE_MODULES = YES; 453 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 454 | DEFINES_MODULE = YES; 455 | DYLIB_COMPATIBILITY_VERSION = 1; 456 | DYLIB_CURRENT_VERSION = 1; 457 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 458 | INFOPLIST_FILE = Sources/Info.plist; 459 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 460 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 461 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 462 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 463 | PRODUCT_NAME = "$(TARGET_NAME)"; 464 | SKIP_INSTALL = YES; 465 | SWIFT_VERSION = 4.2; 466 | }; 467 | name = Release; 468 | }; 469 | 6E7E40901C84B1A20030CEBB /* Debug */ = { 470 | isa = XCBuildConfiguration; 471 | buildSettings = { 472 | APPLICATION_EXTENSION_API_ONLY = YES; 473 | CODE_SIGN_IDENTITY = ""; 474 | COMBINE_HIDPI_IMAGES = YES; 475 | DEFINES_MODULE = YES; 476 | DYLIB_COMPATIBILITY_VERSION = 1; 477 | DYLIB_CURRENT_VERSION = 1; 478 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 479 | FRAMEWORK_VERSION = A; 480 | INFOPLIST_FILE = Sources/Info.plist; 481 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 482 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 483 | MACOSX_DEPLOYMENT_TARGET = 10.9; 484 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 485 | PRODUCT_NAME = SwiftyTimer; 486 | SDKROOT = macosx; 487 | SKIP_INSTALL = YES; 488 | SWIFT_VERSION = 4.2; 489 | }; 490 | name = Debug; 491 | }; 492 | 6E7E40911C84B1A20030CEBB /* Release */ = { 493 | isa = XCBuildConfiguration; 494 | buildSettings = { 495 | APPLICATION_EXTENSION_API_ONLY = YES; 496 | CODE_SIGN_IDENTITY = ""; 497 | COMBINE_HIDPI_IMAGES = YES; 498 | DEFINES_MODULE = YES; 499 | DYLIB_COMPATIBILITY_VERSION = 1; 500 | DYLIB_CURRENT_VERSION = 1; 501 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 502 | FRAMEWORK_VERSION = A; 503 | INFOPLIST_FILE = Sources/Info.plist; 504 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 505 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 506 | MACOSX_DEPLOYMENT_TARGET = 10.9; 507 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 508 | PRODUCT_NAME = SwiftyTimer; 509 | SDKROOT = macosx; 510 | SKIP_INSTALL = YES; 511 | SWIFT_VERSION = 4.2; 512 | }; 513 | name = Release; 514 | }; 515 | 6E7E40A01C84B3790030CEBB /* Debug */ = { 516 | isa = XCBuildConfiguration; 517 | buildSettings = { 518 | APPLICATION_EXTENSION_API_ONLY = YES; 519 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 520 | DEFINES_MODULE = YES; 521 | DYLIB_COMPATIBILITY_VERSION = 1; 522 | DYLIB_CURRENT_VERSION = 1; 523 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 524 | INFOPLIST_FILE = Sources/Info.plist; 525 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 526 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 527 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 528 | PRODUCT_NAME = SwiftyTimer; 529 | SDKROOT = appletvos; 530 | SKIP_INSTALL = YES; 531 | SWIFT_VERSION = 4.2; 532 | TARGETED_DEVICE_FAMILY = 3; 533 | TVOS_DEPLOYMENT_TARGET = 9.0; 534 | }; 535 | name = Debug; 536 | }; 537 | 6E7E40A11C84B3790030CEBB /* Release */ = { 538 | isa = XCBuildConfiguration; 539 | buildSettings = { 540 | APPLICATION_EXTENSION_API_ONLY = YES; 541 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 542 | DEFINES_MODULE = YES; 543 | DYLIB_COMPATIBILITY_VERSION = 1; 544 | DYLIB_CURRENT_VERSION = 1; 545 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 546 | INFOPLIST_FILE = Sources/Info.plist; 547 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 548 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 549 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 550 | PRODUCT_NAME = SwiftyTimer; 551 | SDKROOT = appletvos; 552 | SKIP_INSTALL = YES; 553 | SWIFT_VERSION = 4.2; 554 | TARGETED_DEVICE_FAMILY = 3; 555 | TVOS_DEPLOYMENT_TARGET = 9.0; 556 | }; 557 | name = Release; 558 | }; 559 | 6E7E40AE1C84B4240030CEBB /* Debug */ = { 560 | isa = XCBuildConfiguration; 561 | buildSettings = { 562 | APPLICATION_EXTENSION_API_ONLY = YES; 563 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 564 | DEFINES_MODULE = YES; 565 | DYLIB_COMPATIBILITY_VERSION = 1; 566 | DYLIB_CURRENT_VERSION = 1; 567 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 568 | INFOPLIST_FILE = Sources/Info.plist; 569 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 570 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 571 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 572 | PRODUCT_NAME = SwiftyTimer; 573 | SDKROOT = watchos; 574 | SKIP_INSTALL = YES; 575 | SWIFT_VERSION = 4.2; 576 | TARGETED_DEVICE_FAMILY = 4; 577 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 578 | }; 579 | name = Debug; 580 | }; 581 | 6E7E40AF1C84B4240030CEBB /* Release */ = { 582 | isa = XCBuildConfiguration; 583 | buildSettings = { 584 | APPLICATION_EXTENSION_API_ONLY = YES; 585 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 586 | DEFINES_MODULE = YES; 587 | DYLIB_COMPATIBILITY_VERSION = 1; 588 | DYLIB_CURRENT_VERSION = 1; 589 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 590 | INFOPLIST_FILE = Sources/Info.plist; 591 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 593 | PRODUCT_BUNDLE_IDENTIFIER = io.radex.SwiftyTimer; 594 | PRODUCT_NAME = SwiftyTimer; 595 | SDKROOT = watchos; 596 | SKIP_INSTALL = YES; 597 | SWIFT_VERSION = 4.2; 598 | TARGETED_DEVICE_FAMILY = 4; 599 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 600 | }; 601 | name = Release; 602 | }; 603 | /* End XCBuildConfiguration section */ 604 | 605 | /* Begin XCConfigurationList section */ 606 | 3E721AB51BF7255C008AF027 /* Build configuration list for PBXProject "SwiftyTimer" */ = { 607 | isa = XCConfigurationList; 608 | buildConfigurations = ( 609 | 3E721AC11BF7255D008AF027 /* Debug */, 610 | 3E721AC21BF7255D008AF027 /* Release */, 611 | ); 612 | defaultConfigurationIsVisible = 0; 613 | defaultConfigurationName = Release; 614 | }; 615 | 3E721AC31BF7255D008AF027 /* Build configuration list for PBXNativeTarget "SwiftyTimer" */ = { 616 | isa = XCConfigurationList; 617 | buildConfigurations = ( 618 | 3E721AC41BF7255D008AF027 /* Debug */, 619 | 3E721AC51BF7255D008AF027 /* Release */, 620 | ); 621 | defaultConfigurationIsVisible = 0; 622 | defaultConfigurationName = Release; 623 | }; 624 | 6E7E408F1C84B1A20030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer OS X" */ = { 625 | isa = XCConfigurationList; 626 | buildConfigurations = ( 627 | 6E7E40901C84B1A20030CEBB /* Debug */, 628 | 6E7E40911C84B1A20030CEBB /* Release */, 629 | ); 630 | defaultConfigurationIsVisible = 0; 631 | defaultConfigurationName = Release; 632 | }; 633 | 6E7E409F1C84B3790030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer tvOS" */ = { 634 | isa = XCConfigurationList; 635 | buildConfigurations = ( 636 | 6E7E40A01C84B3790030CEBB /* Debug */, 637 | 6E7E40A11C84B3790030CEBB /* Release */, 638 | ); 639 | defaultConfigurationIsVisible = 0; 640 | defaultConfigurationName = Release; 641 | }; 642 | 6E7E40AD1C84B4240030CEBB /* Build configuration list for PBXNativeTarget "SwiftyTimer watchOS" */ = { 643 | isa = XCConfigurationList; 644 | buildConfigurations = ( 645 | 6E7E40AE1C84B4240030CEBB /* Debug */, 646 | 6E7E40AF1C84B4240030CEBB /* Release */, 647 | ); 648 | defaultConfigurationIsVisible = 0; 649 | defaultConfigurationName = Release; 650 | }; 651 | /* End XCConfigurationList section */ 652 | }; 653 | rootObject = 3E721AB21BF7255C008AF027 /* Project object */; 654 | } 655 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/xcshareddata/xcschemes/SwiftyTimer OS X.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/xcshareddata/xcschemes/SwiftyTimer tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/xcshareddata/xcschemes/SwiftyTimer watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftyTimer.xcodeproj/xcshareddata/xcschemes/SwiftyTimer.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 6EE9C1591B00BB5B00D6B91C /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EE9C1581B00BB5B00D6B91C /* main.swift */; }; 11 | 6EE9C1741B00BBB700D6B91C /* SwiftyTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EE9C1731B00BBB700D6B91C /* SwiftyTimer.swift */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXFileReference section */ 15 | 6EE9C1531B00BB5B00D6B91C /* SwiftyTimerTests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftyTimerTests.app; sourceTree = BUILT_PRODUCTS_DIR; }; 16 | 6EE9C1571B00BB5B00D6B91C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 17 | 6EE9C1581B00BB5B00D6B91C /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 18 | 6EE9C1731B00BBB700D6B91C /* SwiftyTimer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftyTimer.swift; path = ../../Sources/SwiftyTimer.swift; sourceTree = ""; }; 19 | /* End PBXFileReference section */ 20 | 21 | /* Begin PBXFrameworksBuildPhase section */ 22 | 6EE9C1501B00BB5B00D6B91C /* Frameworks */ = { 23 | isa = PBXFrameworksBuildPhase; 24 | buildActionMask = 2147483647; 25 | files = ( 26 | ); 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXFrameworksBuildPhase section */ 30 | 31 | /* Begin PBXGroup section */ 32 | 6EE9C14A1B00BB5B00D6B91C = { 33 | isa = PBXGroup; 34 | children = ( 35 | 6EE9C1551B00BB5B00D6B91C /* SwiftyTimerTests */, 36 | 6EE9C1541B00BB5B00D6B91C /* Products */, 37 | ); 38 | sourceTree = ""; 39 | }; 40 | 6EE9C1541B00BB5B00D6B91C /* Products */ = { 41 | isa = PBXGroup; 42 | children = ( 43 | 6EE9C1531B00BB5B00D6B91C /* SwiftyTimerTests.app */, 44 | ); 45 | name = Products; 46 | sourceTree = ""; 47 | }; 48 | 6EE9C1551B00BB5B00D6B91C /* SwiftyTimerTests */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | 6EE9C1731B00BBB700D6B91C /* SwiftyTimer.swift */, 52 | 6EE9C1581B00BB5B00D6B91C /* main.swift */, 53 | 6EE9C1561B00BB5B00D6B91C /* Supporting Files */, 54 | ); 55 | path = SwiftyTimerTests; 56 | sourceTree = ""; 57 | }; 58 | 6EE9C1561B00BB5B00D6B91C /* Supporting Files */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 6EE9C1571B00BB5B00D6B91C /* Info.plist */, 62 | ); 63 | name = "Supporting Files"; 64 | sourceTree = ""; 65 | }; 66 | /* End PBXGroup section */ 67 | 68 | /* Begin PBXNativeTarget section */ 69 | 6EE9C1521B00BB5B00D6B91C /* SwiftyTimerTests */ = { 70 | isa = PBXNativeTarget; 71 | buildConfigurationList = 6EE9C16D1B00BB5B00D6B91C /* Build configuration list for PBXNativeTarget "SwiftyTimerTests" */; 72 | buildPhases = ( 73 | 6EE9C14F1B00BB5B00D6B91C /* Sources */, 74 | 6EE9C1501B00BB5B00D6B91C /* Frameworks */, 75 | 6EE9C1511B00BB5B00D6B91C /* Resources */, 76 | ); 77 | buildRules = ( 78 | ); 79 | dependencies = ( 80 | ); 81 | name = SwiftyTimerTests; 82 | productName = SwiftyTimerTests; 83 | productReference = 6EE9C1531B00BB5B00D6B91C /* SwiftyTimerTests.app */; 84 | productType = "com.apple.product-type.application"; 85 | }; 86 | /* End PBXNativeTarget section */ 87 | 88 | /* Begin PBXProject section */ 89 | 6EE9C14B1B00BB5B00D6B91C /* Project object */ = { 90 | isa = PBXProject; 91 | attributes = { 92 | LastSwiftUpdateCheck = 0700; 93 | LastUpgradeCheck = 1000; 94 | TargetAttributes = { 95 | 6EE9C1521B00BB5B00D6B91C = { 96 | CreatedOnToolsVersion = 6.4; 97 | LastSwiftMigration = 0800; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = 6EE9C14E1B00BB5B00D6B91C /* Build configuration list for PBXProject "SwiftyTimerTests" */; 102 | compatibilityVersion = "Xcode 3.2"; 103 | developmentRegion = English; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | Base, 108 | ); 109 | mainGroup = 6EE9C14A1B00BB5B00D6B91C; 110 | productRefGroup = 6EE9C1541B00BB5B00D6B91C /* Products */; 111 | projectDirPath = ""; 112 | projectRoot = ""; 113 | targets = ( 114 | 6EE9C1521B00BB5B00D6B91C /* SwiftyTimerTests */, 115 | ); 116 | }; 117 | /* End PBXProject section */ 118 | 119 | /* Begin PBXResourcesBuildPhase section */ 120 | 6EE9C1511B00BB5B00D6B91C /* Resources */ = { 121 | isa = PBXResourcesBuildPhase; 122 | buildActionMask = 2147483647; 123 | files = ( 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXResourcesBuildPhase section */ 128 | 129 | /* Begin PBXSourcesBuildPhase section */ 130 | 6EE9C14F1B00BB5B00D6B91C /* Sources */ = { 131 | isa = PBXSourcesBuildPhase; 132 | buildActionMask = 2147483647; 133 | files = ( 134 | 6EE9C1591B00BB5B00D6B91C /* main.swift in Sources */, 135 | 6EE9C1741B00BBB700D6B91C /* SwiftyTimer.swift in Sources */, 136 | ); 137 | runOnlyForDeploymentPostprocessing = 0; 138 | }; 139 | /* End PBXSourcesBuildPhase section */ 140 | 141 | /* Begin XCBuildConfiguration section */ 142 | 6EE9C16B1B00BB5B00D6B91C /* Debug */ = { 143 | isa = XCBuildConfiguration; 144 | buildSettings = { 145 | ALWAYS_SEARCH_USER_PATHS = NO; 146 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 147 | CLANG_CXX_LIBRARY = "libc++"; 148 | CLANG_ENABLE_MODULES = YES; 149 | CLANG_ENABLE_OBJC_ARC = YES; 150 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 151 | CLANG_WARN_BOOL_CONVERSION = YES; 152 | CLANG_WARN_COMMA = YES; 153 | CLANG_WARN_CONSTANT_CONVERSION = YES; 154 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 155 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 156 | CLANG_WARN_EMPTY_BODY = YES; 157 | CLANG_WARN_ENUM_CONVERSION = YES; 158 | CLANG_WARN_INFINITE_RECURSION = YES; 159 | CLANG_WARN_INT_CONVERSION = YES; 160 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 161 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 162 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 163 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 164 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 165 | CLANG_WARN_STRICT_PROTOTYPES = YES; 166 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 167 | CLANG_WARN_UNREACHABLE_CODE = YES; 168 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 169 | CODE_SIGN_IDENTITY = "-"; 170 | COPY_PHASE_STRIP = NO; 171 | DEBUG_INFORMATION_FORMAT = dwarf; 172 | ENABLE_STRICT_OBJC_MSGSEND = YES; 173 | ENABLE_TESTABILITY = YES; 174 | GCC_C_LANGUAGE_STANDARD = gnu99; 175 | GCC_DYNAMIC_NO_PIC = NO; 176 | GCC_NO_COMMON_BLOCKS = YES; 177 | GCC_OPTIMIZATION_LEVEL = 0; 178 | GCC_PREPROCESSOR_DEFINITIONS = ( 179 | "DEBUG=1", 180 | "$(inherited)", 181 | ); 182 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 183 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 184 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 185 | GCC_WARN_UNDECLARED_SELECTOR = YES; 186 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 187 | GCC_WARN_UNUSED_FUNCTION = YES; 188 | GCC_WARN_UNUSED_VARIABLE = YES; 189 | MACOSX_DEPLOYMENT_TARGET = 10.10; 190 | MTL_ENABLE_DEBUG_INFO = YES; 191 | ONLY_ACTIVE_ARCH = YES; 192 | SDKROOT = macosx; 193 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 194 | SWIFT_VERSION = 4.2; 195 | }; 196 | name = Debug; 197 | }; 198 | 6EE9C16C1B00BB5B00D6B91C /* Release */ = { 199 | isa = XCBuildConfiguration; 200 | buildSettings = { 201 | ALWAYS_SEARCH_USER_PATHS = NO; 202 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 203 | CLANG_CXX_LIBRARY = "libc++"; 204 | CLANG_ENABLE_MODULES = YES; 205 | CLANG_ENABLE_OBJC_ARC = YES; 206 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 207 | CLANG_WARN_BOOL_CONVERSION = YES; 208 | CLANG_WARN_COMMA = YES; 209 | CLANG_WARN_CONSTANT_CONVERSION = YES; 210 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 211 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 212 | CLANG_WARN_EMPTY_BODY = YES; 213 | CLANG_WARN_ENUM_CONVERSION = YES; 214 | CLANG_WARN_INFINITE_RECURSION = YES; 215 | CLANG_WARN_INT_CONVERSION = YES; 216 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 217 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 218 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 219 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 220 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 221 | CLANG_WARN_STRICT_PROTOTYPES = YES; 222 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 223 | CLANG_WARN_UNREACHABLE_CODE = YES; 224 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 225 | CODE_SIGN_IDENTITY = "-"; 226 | COPY_PHASE_STRIP = NO; 227 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 228 | ENABLE_NS_ASSERTIONS = NO; 229 | ENABLE_STRICT_OBJC_MSGSEND = YES; 230 | GCC_C_LANGUAGE_STANDARD = gnu99; 231 | GCC_NO_COMMON_BLOCKS = YES; 232 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 233 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 234 | GCC_WARN_UNDECLARED_SELECTOR = YES; 235 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 236 | GCC_WARN_UNUSED_FUNCTION = YES; 237 | GCC_WARN_UNUSED_VARIABLE = YES; 238 | MACOSX_DEPLOYMENT_TARGET = 10.10; 239 | MTL_ENABLE_DEBUG_INFO = NO; 240 | SDKROOT = macosx; 241 | SWIFT_VERSION = 4.2; 242 | }; 243 | name = Release; 244 | }; 245 | 6EE9C16E1B00BB5B00D6B91C /* Debug */ = { 246 | isa = XCBuildConfiguration; 247 | buildSettings = { 248 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 249 | COMBINE_HIDPI_IMAGES = YES; 250 | INFOPLIST_FILE = SwiftyTimerTests/Info.plist; 251 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 252 | PRODUCT_BUNDLE_IDENTIFIER = "radex.$(PRODUCT_NAME:rfc1034identifier)"; 253 | PRODUCT_NAME = "$(TARGET_NAME)"; 254 | SWIFT_VERSION = 4.2; 255 | }; 256 | name = Debug; 257 | }; 258 | 6EE9C16F1B00BB5B00D6B91C /* Release */ = { 259 | isa = XCBuildConfiguration; 260 | buildSettings = { 261 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 262 | COMBINE_HIDPI_IMAGES = YES; 263 | INFOPLIST_FILE = SwiftyTimerTests/Info.plist; 264 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 265 | PRODUCT_BUNDLE_IDENTIFIER = "radex.$(PRODUCT_NAME:rfc1034identifier)"; 266 | PRODUCT_NAME = "$(TARGET_NAME)"; 267 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 268 | SWIFT_VERSION = 4.2; 269 | }; 270 | name = Release; 271 | }; 272 | /* End XCBuildConfiguration section */ 273 | 274 | /* Begin XCConfigurationList section */ 275 | 6EE9C14E1B00BB5B00D6B91C /* Build configuration list for PBXProject "SwiftyTimerTests" */ = { 276 | isa = XCConfigurationList; 277 | buildConfigurations = ( 278 | 6EE9C16B1B00BB5B00D6B91C /* Debug */, 279 | 6EE9C16C1B00BB5B00D6B91C /* Release */, 280 | ); 281 | defaultConfigurationIsVisible = 0; 282 | defaultConfigurationName = Release; 283 | }; 284 | 6EE9C16D1B00BB5B00D6B91C /* Build configuration list for PBXNativeTarget "SwiftyTimerTests" */ = { 285 | isa = XCConfigurationList; 286 | buildConfigurations = ( 287 | 6EE9C16E1B00BB5B00D6B91C /* Debug */, 288 | 6EE9C16F1B00BB5B00D6B91C /* Release */, 289 | ); 290 | defaultConfigurationIsVisible = 0; 291 | defaultConfigurationName = Release; 292 | }; 293 | /* End XCConfigurationList section */ 294 | }; 295 | rootObject = 6EE9C14B1B00BB5B00D6B91C /* Project object */; 296 | } 297 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests.xcodeproj/xcshareddata/xcschemes/SwiftyTimerTests.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSPrincipalClass 28 | NSApplication 29 | 30 | 31 | -------------------------------------------------------------------------------- /SwiftyTimerTests/SwiftyTimerTests/main.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | 3 | let app = NSApplication.shared 4 | 5 | class AppDelegate: NSObject, NSApplicationDelegate { 6 | func applicationDidFinishLaunching(_ aNotification: Notification) { 7 | test() 8 | } 9 | 10 | func test() { 11 | assert(1.second == 1.0) 12 | assert(1.minute == 60.0) 13 | assert(1.hour == 1.minute * 60) 14 | assert(1.2.seconds == 1.2) 15 | assert(1.5.minutes == 90.0) 16 | assert(1.5.hours == 5400.0) 17 | assert(1.3.milliseconds == 0.0013) 18 | assert(0.5.day == 43_200 ) 19 | assert(1.day == 86_400 ) 20 | assert(2.days == 172_800) 21 | test2() 22 | } 23 | 24 | func test2() { 25 | var fired = false 26 | Timer.after(0.1.seconds) { 27 | assert(!fired) 28 | fired = true 29 | self.test3() 30 | } 31 | } 32 | 33 | var timer1: Timer! 34 | 35 | func test3() { 36 | var fired = false 37 | timer1 = Timer.every(0.1.seconds) { 38 | if fired { 39 | self.test4() 40 | self.timer1.invalidate() 41 | } else { 42 | fired = true 43 | } 44 | } 45 | } 46 | 47 | let timer2 = Timer.new(after: 0.1.seconds) { fatalError() } 48 | let timer3 = Timer.new(every: 0.1.seconds) { fatalError() } 49 | 50 | func test4() { 51 | let timer = Timer.new(after: 0.1.seconds) { 52 | self.test5() 53 | } 54 | RunLoop.current.add(timer, forMode: .default) 55 | } 56 | 57 | var timer4: Timer! 58 | 59 | func test5() { 60 | var fired = false 61 | timer4 = Timer.new(every: 0.1.seconds) { 62 | if fired { 63 | self.timer4.invalidate() 64 | self.test6() 65 | } else { 66 | fired = true 67 | } 68 | } 69 | timer4.start() 70 | } 71 | 72 | func test6() { 73 | let timer = Timer.new(after: 0.1.seconds) { 74 | self.test7() 75 | } 76 | 77 | timer.start(runLoop: .current, modes: .default, .eventTracking) 78 | } 79 | 80 | func test7() { 81 | Timer.after(0.1.seconds, test8) 82 | } 83 | 84 | func test8() { 85 | var fires = 0 86 | let timer = Timer.new(every: 0.1.seconds) { (timer: Timer) in 87 | guard fires <= 1 else { fatalError("should be invalidated") } 88 | defer { fires += 1 } 89 | 90 | if fires == 1 { 91 | timer.invalidate() 92 | self.test9() 93 | } 94 | } 95 | timer.start() 96 | } 97 | 98 | func test9() { 99 | var fires = 0 100 | Timer.every(0.1.seconds) { (timer: Timer) in 101 | guard fires <= 1 else { fatalError("should be invalidated") } 102 | defer { fires += 1 } 103 | 104 | if fires == 1 { 105 | timer.invalidate() 106 | self.done() 107 | } 108 | } 109 | } 110 | 111 | func done() { 112 | print("All tests passed") 113 | app.terminate(self) 114 | } 115 | } 116 | 117 | let delegate = AppDelegate() 118 | app.delegate = delegate 119 | app.run() 120 | --------------------------------------------------------------------------------