├── .github └── CONTRIBUTING.md ├── .gitignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── Package.swift ├── README.md ├── Sources ├── Date+Timepiece.swift ├── DateComponents+Timepiece.swift ├── Int+Timepiece.swift └── String+Timepiece.swift ├── Tests └── TimepieceTests │ ├── Date+TimepieceTests.swift │ ├── DateComponents+TimepieceTests.swift │ ├── Int+TimepieceTests.swift │ └── String+TimepieceTests.swift ├── Timepiece.playground ├── Contents.swift ├── Sources │ └── SupportCode.swift ├── contents.xcplayground └── playground.xcworkspace │ └── contents.xcworkspacedata ├── Timepiece.podspec ├── Timepiece.xcodeproj ├── Timepiece-Info.plist ├── TimepieceTests-Info.plist ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── Timepiece OSX.xcscheme │ ├── Timepiece iOS.xcscheme │ ├── Timepiece tvOS.xcscheme │ └── Timepiece watchOS.xcscheme └── Timepiece.xcworkspace └── contents.xcworkspacedata /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## How to contribute 2 | * We are welcome issues about bugs and pull requests to fix bugs. 3 | * We are also welcome issues and pull requests about new features. But, we will not merge followings. 4 | * Adding new ways to do the same thing as existing features. More options this library gives, more comfusing it is. 5 | * Self-centered ideas such as a feature to support a rare usecase or a change of APIs for own readability. 6 | * Labels are helpful to decide which issues we should put priority on. 7 | 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/bab15e82cb861b39216d0ab7ec0b3950bd73313e/Objective-C.gitignore 2 | 3 | # Xcode 4 | # 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | *.moved-aside 17 | DerivedData 18 | *.hmap 19 | *.ipa 20 | *.xcuserstate 21 | 22 | # CocoaPods 23 | # 24 | # We recommend against adding the Pods directory to your .gitignore. However 25 | # you should judge for yourself, the pros and cons are mentioned at: 26 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 27 | # 28 | # Pods/ 29 | 30 | 31 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode10.2 3 | before_install: 4 | - gem install xcpretty -N 5 | script: 6 | - set -o pipefail 7 | - xcodebuild -version 8 | - xcodebuild -showsdks 9 | - xcodebuild -project Timepiece.xcodeproj -scheme "Timepiece iOS" -destination "platform=iOS Simulator,name=iPhone 6" ONLY_ACTIVE_ARCH=NO test | xcpretty -c 10 | - pod lib lint --quick 11 | 12 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. 3 | 4 | ## Unreleased 5 | 6 | ## 1.3.1 7 | Released on 2017-10-01. 8 | 9 | ### Fixed 10 | * Issue where apps could not be summited to Appstore. [#90](https://github.com/naoty/Timepiece/pull/90) 11 | 12 | ## 1.3.0 13 | Released on 2017-09-30. 14 | 15 | ### Added 16 | * Swift 4 support 17 | 18 | ## 1.2.0 19 | Released on 2017-04-30. 20 | 21 | ### Added 22 | * Support Swift Package Manager. [#83](https://github.com/naoty/Timepiece/pull/83) 23 | * `truncated(_:)`, which creates a `Date` instance by truncating the components. [#82](https://github.com/naoty/Timepiece/pull/82) 24 | * `truncated(from:)`, which creates a `Date` instance by truncating the components from a given component. [#82](https://github.com/naoty/Timepiece/pull/82) 25 | 26 | ### Fixed 27 | * Rename `string(inDateStyle:andTimeStyle:)` to `stringIn(dateStyle:timeStyle:)`. 28 | * Rename `dateInISO8601Format(withOptions:)` to `dateInISO8601Format(with:)`. 29 | 30 | ## 1.1.0 31 | Released on 2017-01-06. 32 | 33 | ### Added 34 | * `changed(year:month:day:hour:minute:second:nanosecond:)`, which creates a `Date` instance by changing receiver's date components. [#77](https://github.com/naoty/Timepiece/pull/77) 35 | * `changed(weekday:)`, which creates a `Date` instance by changing receiver's weekday. [#77](https://github.com/naoty/Timepiece/pull/77) 36 | 37 | ## 1.0.2 38 | Released on 2016-12-20. 39 | 40 | ### Fixed 41 | * Fix testDateInISO8601Format() availability. [#74](https://github.com/naoty/Timepiece/pull/74). 42 | * Specify Swift version for the compilation of watchOS target. [#79](https://github.com/naoty/Timepiece/pull/79). 43 | 44 | ## 1.0.1 45 | Released on 2016-11-05. 46 | 47 | ### Changed 48 | * Create instance of date components instead of mutable variables. [#67](https://github.com/naoty/Timepiece/pull/67). 49 | 50 | ### Fixed 51 | * Fix App Store submission issue. [#71](https://github.com/naoty/Timepiece/pull/71). 52 | 53 | ## 1.0.0 54 | Released on 2016-10-30. 55 | 56 | ### Added 57 | * New initializers for `Date`. 58 | * `+` and `-` between `DateComponents` 59 | * Methods to format `Date` with date style. 60 | * A method to format `DateComponents` with units style. 61 | * A method to parse `String` using `ISO8601DateFormatter`. 62 | 63 | ### Removed 64 | * `Date.date()` constructor methods. 65 | * `Duration`. 66 | * Time zone support for each `Date`. 67 | * Properties to get beginning and end of periods such as `beginningOfYear`, `endOfMonth`. 68 | * `change()`. 69 | 70 | ### Changed 71 | * For `Int`, `year`, `month` and so on creates new `DateComponents` instance instead of `Duration`. 72 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Naoto Kaneko 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 | 23 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "Timepiece", 6 | platforms: [ 7 | .macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v2) 8 | ], 9 | products: [ 10 | .library(name: "Timepiece", targets: ["Timepiece"]), 11 | ], 12 | dependencies: [], 13 | targets: [ 14 | .target( 15 | name: "Timepiece", 16 | dependencies: [], 17 | path: "Sources" 18 | ), 19 | .testTarget( 20 | name: "TimepieceTests", 21 | dependencies: ["Timepiece"] 22 | ), 23 | ], 24 | swiftLanguageVersions: [.v5] 25 | ) 26 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Timepiece [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Timepiece.svg)](https://cocoapods.org/pods/Timepiece) [![Build Status](http://img.shields.io/travis/naoty/Timepiece/master.svg?style=flat)](https://travis-ci.org/naoty/Timepiece) 2 | Intuitive date handling in Swift 3 | 4 | ## Features 5 | * :bulb: **Intuitive**: Timepiece provides a set of helpers to make date handling easier. 6 | * :clock9: **Correct**: Using Foundation API correctly, Timepiece helps to calculate dates correctly without deep understanding. 7 | * :package: **Small**: Timepiece has only 4 file. You can read the inside of this easily. 8 | 9 | ## Requirements 10 | 11 | * Swift 3.0+ 12 | * iOS 8.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+ 13 | 14 | ## Usage 15 | 16 | ### Initialization 17 | 18 | ```swift 19 | Date(era: 235, year: 26, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0, on: Calendar(identifier: .japanese)) 20 | Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 21 | Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43) 22 | Date(year: 2014, month: 8, day: 14) 23 | 24 | Date.today() 25 | Date.yesterday() 26 | Date.tomorrow() 27 | ``` 28 | 29 | ### Calculation 30 | 31 | ```swift 32 | now + 1.year 33 | now - 2.months 34 | now + (3.weeks - 4.days + 5.hours) 35 | 36 | 1.year.later 37 | 1.year.ago 38 | ``` 39 | 40 | ### Change 41 | 42 | ```swift 43 | now.changed(year: 2014) 44 | now.changed(weekday: 1) 45 | now.truncated([.minute, .second, .nanosecond]) 46 | now.truncated(from: .day) 47 | ``` 48 | 49 | ### Formating 50 | 51 | ```swift 52 | now.stringIn(dateStyle: .long, timeStyle: .medium) 53 | now.dateString(in: .medium) 54 | now.timeString(in: .short) 55 | 56 | 3.days.string(in: .full) 57 | ``` 58 | 59 | ### Parsing 60 | 61 | ```swift 62 | "2014/8/14".date(inFormat: "yyyy/MM/dd") 63 | "2014-08-14T20:25:43+0900".dateInISO8601Format() 64 | ``` 65 | 66 | ## Installation 67 | 68 | ### CocoaPods 69 | 70 | ```ruby 71 | # Podfile 72 | pod "Timepiece" 73 | ``` 74 | 75 | ### Carthage 76 | 77 | ```ruby 78 | # Cartfile 79 | github "naoty/Timepiece" 80 | ``` 81 | 82 | ## Contribution 83 | 84 | 1. Fork 85 | 2. Create your feature branch (git checkout -b my-new-feature) 86 | 3. Commit your changes (git commit -am 'Add some feature') 87 | 4. Push to the branch (git push origin my-new-feature) 88 | 5. Create new Pull Request 89 | 90 | ## License 91 | 92 | Timepiece is available under the MIT license. See the LICENSE file for more info. 93 | 94 | ## Author 95 | 96 | [naoty](https://github.com/naoty) 97 | 98 | -------------------------------------------------------------------------------- /Sources/Date+Timepiece.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Date+Timepiece.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 10/2/16. 6 | // Copyright © 2016 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Date { 12 | /// The year. 13 | public var year: Int { 14 | return dateComponents.year! 15 | } 16 | 17 | /// The month. 18 | public var month: Int { 19 | return dateComponents.month! 20 | } 21 | 22 | /// The day. 23 | public var day: Int { 24 | return dateComponents.day! 25 | } 26 | 27 | /// The hour. 28 | public var hour: Int { 29 | return dateComponents.hour! 30 | } 31 | 32 | /// The minute. 33 | public var minute: Int { 34 | return dateComponents.minute! 35 | } 36 | 37 | /// The second. 38 | public var second: Int { 39 | return dateComponents.second! 40 | } 41 | 42 | /// The nanosecond. 43 | public var nanosecond: Int { 44 | return dateComponents.nanosecond! 45 | } 46 | 47 | /// The weekday. 48 | public var weekday: Int { 49 | return dateComponents.weekday! 50 | } 51 | 52 | private var dateComponents: DateComponents { 53 | return calendar.dateComponents([.era, .year, .month, .day, .hour, .minute, .second, .nanosecond, .weekday], from: self) 54 | } 55 | 56 | // Returns user's calendar to be used to return `DateComponents` of the receiver. 57 | private var calendar: Calendar { 58 | return .current 59 | } 60 | 61 | /// Creates a new instance with specified date components. 62 | /// 63 | /// - parameter era: The era. 64 | /// - parameter year: The year. 65 | /// - parameter month: The month. 66 | /// - parameter day: The day. 67 | /// - parameter hour: The hour. 68 | /// - parameter minute: The minute. 69 | /// - parameter second: The second. 70 | /// - parameter nanosecond: The nanosecond. 71 | /// - parameter calendar: The calendar used to create a new instance. 72 | /// 73 | /// - returns: The created `Date` instance. 74 | public init(era: Int?, year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int, nanosecond: Int, on calendar: Calendar) { 75 | let now = Date() 76 | var dateComponents = calendar.dateComponents([.era, .year, .month, .day, .hour, .minute, .second, .nanosecond], from: now) 77 | dateComponents.era = era 78 | dateComponents.year = year 79 | dateComponents.month = month 80 | dateComponents.day = day 81 | dateComponents.hour = hour 82 | dateComponents.minute = minute 83 | dateComponents.second = second 84 | dateComponents.nanosecond = nanosecond 85 | 86 | let date = calendar.date(from: dateComponents) 87 | self.init(timeInterval: 0, since: date!) 88 | } 89 | 90 | /// Creates a new instance with specified date componentns. 91 | /// 92 | /// - parameter year: The year. 93 | /// - parameter month: The month. 94 | /// - parameter day: The day. 95 | /// - parameter hour: The hour. 96 | /// - parameter minute: The minute. 97 | /// - parameter second: The second. 98 | /// - parameter nanosecond: The nanosecond. `0` by default. 99 | /// 100 | /// - returns: The created `Date` instance. 101 | public init(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int, nanosecond: Int = 0) { 102 | self.init(era: nil, year: year, month: month, day: day, hour: hour, minute: minute, second: second, nanosecond: nanosecond, on: .current) 103 | } 104 | 105 | /// Creates a new Instance with specified date components 106 | /// 107 | /// - parameter year: The year. 108 | /// - parameter month: The month. 109 | /// - parameter day: The day. 110 | /// 111 | /// - returns: The created `Date` instance. 112 | public init(year: Int, month: Int, day: Int) { 113 | self.init(year: year, month: month, day: day, hour: 0, minute: 0, second: 0) 114 | } 115 | 116 | /// Creates a new instance representing today. 117 | /// 118 | /// - returns: The created `Date` instance representing today. 119 | public static func today() -> Date { 120 | let now = Date() 121 | return Date(year: now.year, month: now.month, day: now.day) 122 | } 123 | 124 | /// Creates a new instance representing yesterday 125 | /// 126 | /// - returns: The created `Date` instance representing yesterday. 127 | public static func yesterday() -> Date { 128 | return (today() - 1.day)! 129 | } 130 | 131 | /// Creates a new instance representing tomorrow 132 | /// 133 | /// - returns: The created `Date` instance representing tomorrow. 134 | public static func tomorrow() -> Date { 135 | return (today() + 1.day)! 136 | } 137 | 138 | /// Creates a new instance added a `DateComponents` 139 | /// 140 | /// - parameter left: The date. 141 | /// - parameter right: The date components. 142 | /// 143 | /// - returns: The created `Date` instance. 144 | public static func + (left: Date, right: DateComponents) -> Date? { 145 | return Calendar.current.date(byAdding: right, to: left) 146 | } 147 | 148 | /// Creates a new instance subtracted a `DateComponents` 149 | /// 150 | /// - parameter left: The date. 151 | /// - parameter right: The date components. 152 | /// 153 | /// - returns: The created `Date` instance. 154 | public static func - (left: Date, right: DateComponents) -> Date? { 155 | return Calendar.current.date(byAdding: -right, to: left) 156 | } 157 | 158 | /// Creates a new instance by changing the date components 159 | /// 160 | /// - Parameters: 161 | /// - year: The year. 162 | /// - month: The month. 163 | /// - day: The day. 164 | /// - hour: The hour. 165 | /// - minute: The minute. 166 | /// - second: The second. 167 | /// - nanosecond: The nanosecond. 168 | /// - Returns: The created `Date` instnace. 169 | public func changed(year: Int? = nil, month: Int? = nil, day: Int? = nil, hour: Int? = nil, minute: Int? = nil, second: Int? = nil, nanosecond: Int? = nil) -> Date? { 170 | var dateComponents = self.dateComponents 171 | dateComponents.year = year ?? self.year 172 | dateComponents.month = month ?? self.month 173 | dateComponents.day = day ?? self.day 174 | dateComponents.hour = hour ?? self.hour 175 | dateComponents.minute = minute ?? self.minute 176 | dateComponents.second = second ?? self.second 177 | dateComponents.nanosecond = nanosecond ?? self.nanosecond 178 | 179 | return calendar.date(from: dateComponents) 180 | } 181 | 182 | /// Creates a new instance by changing the year. 183 | /// 184 | /// - Parameter year: The year. 185 | /// - Returns: The created `Date` instance. 186 | public func changed(year: Int) -> Date? { 187 | return changed(year: year, month: nil, day: nil, hour: nil, minute: nil, second: nil, nanosecond: nil) 188 | } 189 | 190 | /// Creates a new instance by changing the month. 191 | /// 192 | /// - Parameter month: The month. 193 | /// - Returns: The created `Date` instance. 194 | public func changed(month: Int) -> Date? { 195 | return changed(year: nil, month: month, day: nil, hour: nil, minute: nil, second: nil, nanosecond: nil) 196 | } 197 | 198 | /// Creates a new instance by changing the day. 199 | /// 200 | /// - Parameter day: The day. 201 | /// - Returns: The created `Date` instance. 202 | public func changed(day: Int) -> Date? { 203 | return changed(year: nil, month: nil, day: day, hour: nil, minute: nil, second: nil, nanosecond: nil) 204 | } 205 | 206 | /// Creates a new instance by changing the hour. 207 | /// 208 | /// - Parameter hour: The hour. 209 | /// - Returns: The created `Date` instance. 210 | public func changed(hour: Int) -> Date? { 211 | return changed(year: nil, month: nil, day: nil, hour: hour, minute: nil, second: nil, nanosecond: nil) 212 | } 213 | 214 | /// Creates a new instance by changing the minute. 215 | /// 216 | /// - Parameter minute: The minute. 217 | /// - Returns: The created `Date` instance. 218 | public func changed(minute: Int) -> Date? { 219 | return changed(year: nil, month: nil, day: nil, hour: nil, minute: minute, second: nil, nanosecond: nil) 220 | } 221 | 222 | /// Creates a new instance by changing the second. 223 | /// 224 | /// - Parameter second: The second. 225 | /// - Returns: The created `Date` instance. 226 | public func changed(second: Int) -> Date? { 227 | return changed(year: nil, month: nil, day: nil, hour: nil, minute: nil, second: second, nanosecond: nil) 228 | } 229 | 230 | /// Creates a new instance by changing the nanosecond. 231 | /// 232 | /// - Parameter nanosecond: The nanosecond. 233 | /// - Returns: The created `Date` instance. 234 | public func changed(nanosecond: Int) -> Date? { 235 | return changed(year: nil, month: nil, day: nil, hour: nil, minute: nil, second: nil, nanosecond: nanosecond) 236 | } 237 | 238 | /// Creates a new instance by changing the weekday. 239 | /// 240 | /// - Parameter weekday: The weekday. 241 | /// - Returns: The created `Date` instance. 242 | public func changed(weekday: Int) -> Date? { 243 | return self - (self.weekday - weekday).days 244 | } 245 | 246 | /// Creates a new instance by truncating the components 247 | /// 248 | /// - Parameter components: The components to be truncated. 249 | /// - Returns: The created `Date` instance. 250 | public func truncated(_ components: [Calendar.Component]) -> Date? { 251 | var dateComponents = self.dateComponents 252 | 253 | for component in components { 254 | switch component { 255 | case .month: 256 | dateComponents.month = 1 257 | case .day: 258 | dateComponents.day = 1 259 | case .hour: 260 | dateComponents.hour = 0 261 | case .minute: 262 | dateComponents.minute = 0 263 | case .second: 264 | dateComponents.second = 0 265 | case .nanosecond: 266 | dateComponents.nanosecond = 0 267 | default: 268 | continue 269 | } 270 | } 271 | 272 | return calendar.date(from: dateComponents) 273 | } 274 | 275 | /// Creates a new instance by truncating the components 276 | /// 277 | /// - Parameter component: The component to be truncated from. 278 | /// - Returns: The created `Date` instance. 279 | public func truncated(from component: Calendar.Component) -> Date? { 280 | switch component { 281 | case .month: 282 | return truncated([.month, .day, .hour, .minute, .second, .nanosecond]) 283 | case .day: 284 | return truncated([.day, .hour, .minute, .second, .nanosecond]) 285 | case .hour: 286 | return truncated([.hour, .minute, .second, .nanosecond]) 287 | case .minute: 288 | return truncated([.minute, .second, .nanosecond]) 289 | case .second: 290 | return truncated([.second, .nanosecond]) 291 | case .nanosecond: 292 | return truncated([.nanosecond]) 293 | default: 294 | return self 295 | } 296 | } 297 | 298 | /// Creates a new `String` instance representing the receiver formatted in given date style and time style. 299 | /// 300 | /// - parameter dateStyle: The date style. 301 | /// - parameter timeStyle: The time style. 302 | /// 303 | /// - returns: The created `String` instance. 304 | public func stringIn(dateStyle: DateFormatter.Style, timeStyle: DateFormatter.Style) -> String { 305 | let dateFormatter = DateFormatter() 306 | dateFormatter.dateStyle = dateStyle 307 | dateFormatter.timeStyle = timeStyle 308 | 309 | return dateFormatter.string(from: self) 310 | } 311 | 312 | @available(*, unavailable, renamed: "stringIn(dateStyle:timeStyle:)") 313 | public func string(inDateStyle dateStyle: DateFormatter.Style, andTimeStyle timeStyle: DateFormatter.Style) -> String { 314 | return stringIn(dateStyle: dateStyle, timeStyle: timeStyle) 315 | } 316 | 317 | /// Creates a new `String` instance representing the date of the receiver formatted in given date style. 318 | /// 319 | /// - parameter dateStyle: The date style. 320 | /// 321 | /// - returns: The created `String` instance. 322 | public func dateString(in dateStyle: DateFormatter.Style) -> String { 323 | return stringIn(dateStyle: dateStyle, timeStyle: .none) 324 | } 325 | 326 | /// Creates a new `String` instance representing the time of the receiver formatted in given time style. 327 | /// 328 | /// - parameter timeStyle: The time style. 329 | /// 330 | /// - returns: The created `String` instance. 331 | public func timeString(in timeStyle: DateFormatter.Style) -> String { 332 | return stringIn(dateStyle: .none, timeStyle: timeStyle) 333 | } 334 | } 335 | -------------------------------------------------------------------------------- /Sources/DateComponents+Timepiece.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateComponents+Timepiece.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 10/16/16. 6 | // Copyright © 2016 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension DateComponents { 12 | var ago: Date? { 13 | return Calendar.current.date(byAdding: -self, to: Date()) 14 | } 15 | 16 | var later: Date? { 17 | return Calendar.current.date(byAdding: self, to: Date()) 18 | } 19 | 20 | /// Creates inverse `DateComponents` 21 | /// 22 | /// - parameter rhs: A `DateComponents` 23 | /// 24 | /// - returns: A created inverse `DateComponents` 25 | static prefix func -(rhs: DateComponents) -> DateComponents { 26 | var dateComponents = DateComponents() 27 | 28 | if let year = rhs.year { 29 | dateComponents.year = -year 30 | } 31 | 32 | if let month = rhs.month { 33 | dateComponents.month = -month 34 | } 35 | 36 | if let day = rhs.day { 37 | dateComponents.day = -day 38 | } 39 | 40 | if let hour = rhs.hour { 41 | dateComponents.hour = -hour 42 | } 43 | 44 | if let minute = rhs.minute { 45 | dateComponents.minute = -minute 46 | } 47 | 48 | if let second = rhs.second { 49 | dateComponents.second = -second 50 | } 51 | 52 | if let nanosecond = rhs.nanosecond { 53 | dateComponents.nanosecond = -nanosecond 54 | } 55 | 56 | return dateComponents 57 | } 58 | 59 | /// Creates a instance calculated by the addition of `right` and `left` 60 | /// 61 | /// - parameter left: The date components at left side. 62 | /// - parameter right: The date components at right side. 63 | /// 64 | /// - returns: Created `DateComponents` instance. 65 | static func + (left: DateComponents, right: DateComponents) -> DateComponents { 66 | var dateComponents = left 67 | 68 | if let year = right.year { 69 | dateComponents.year = (dateComponents.year ?? 0) + year 70 | } 71 | 72 | if let month = right.month { 73 | dateComponents.month = (dateComponents.month ?? 0) + month 74 | } 75 | 76 | if let day = right.day { 77 | dateComponents.day = (dateComponents.day ?? 0) + day 78 | } 79 | 80 | if let hour = right.hour { 81 | dateComponents.hour = (dateComponents.hour ?? 0) + hour 82 | } 83 | 84 | if let minute = right.minute { 85 | dateComponents.minute = (dateComponents.minute ?? 0) + minute 86 | } 87 | 88 | if let second = right.second { 89 | dateComponents.second = (dateComponents.second ?? 0) + second 90 | } 91 | 92 | if let nanosecond = right.nanosecond { 93 | dateComponents.nanosecond = (dateComponents.nanosecond ?? 0) + nanosecond 94 | } 95 | 96 | return dateComponents 97 | } 98 | 99 | /// Creates a instance calculated by the subtraction from `right` to `left` 100 | /// 101 | /// - parameter left: The date components at left side. 102 | /// - parameter right: The date components at right side. 103 | /// 104 | /// - returns: Created `DateComponents` instance. 105 | static func - (left: DateComponents, right: DateComponents) -> DateComponents { 106 | return left + (-right) 107 | } 108 | 109 | /// Creates a `String` instance representing the receiver formatted in given units style. 110 | /// 111 | /// - parameter unitsStyle: The units style. 112 | /// 113 | /// - returns: The created a `String` instance. 114 | @available(OSX 10.10, *) 115 | func string(in unitsStyle: DateComponentsFormatter.UnitsStyle) -> String? { 116 | let dateComponentsFormatter = DateComponentsFormatter() 117 | dateComponentsFormatter.unitsStyle = unitsStyle 118 | dateComponentsFormatter.allowedUnits = [.year, .month, .weekOfMonth, .day, .hour, .minute, .second] 119 | 120 | return dateComponentsFormatter.string(from: self) 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /Sources/Int+Timepiece.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+Timepiece.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 2014/08/15. 6 | // Copyright (c) 2014年 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension Int { 12 | var year: DateComponents { 13 | return DateComponents(year: self) 14 | } 15 | 16 | var years: DateComponents { 17 | return year 18 | } 19 | 20 | var month: DateComponents { 21 | return DateComponents(month: self) 22 | } 23 | 24 | var months: DateComponents { 25 | return month 26 | } 27 | 28 | var week: DateComponents { 29 | return DateComponents(day: 7 * self) 30 | } 31 | 32 | var weeks: DateComponents { 33 | return week 34 | } 35 | 36 | var day: DateComponents { 37 | return DateComponents(day: self) 38 | } 39 | 40 | var days: DateComponents { 41 | return day 42 | } 43 | 44 | var hour: DateComponents { 45 | return DateComponents(hour: self) 46 | } 47 | 48 | var hours: DateComponents { 49 | return hour 50 | } 51 | 52 | var minute: DateComponents { 53 | return DateComponents(minute: self) 54 | } 55 | 56 | var minutes: DateComponents { 57 | return minute 58 | } 59 | 60 | var second: DateComponents { 61 | return DateComponents(second: self) 62 | } 63 | 64 | var seconds: DateComponents { 65 | return second 66 | } 67 | 68 | var nanosecond: DateComponents { 69 | return DateComponents(nanosecond: self) 70 | } 71 | 72 | var nanoseconds: DateComponents { 73 | return nanosecond 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /Sources/String+Timepiece.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Timepiece.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 2015/03/01. 6 | // Copyright (c) 2015年 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension String { 12 | /// Creates a `Date` instance representing the receiver parsed into `Date` in a given format. 13 | /// 14 | /// - parameter format: The format to be used to parse. 15 | /// 16 | /// - returns: The created `Date` instance. 17 | public func date(inFormat format: String) -> Date? { 18 | let dateFormatter = DateFormatter() 19 | dateFormatter.dateFormat = format 20 | dateFormatter.locale = Locale(identifier: "en_US_POSIX") 21 | dateFormatter.timeZone = TimeZone(secondsFromGMT: 0) 22 | 23 | return dateFormatter.date(from: self) 24 | } 25 | 26 | /// Creates a `Date` instance representing the receiver in ISO8601 format parsed into `Date` with given options. 27 | /// 28 | /// - parameter options: The options to be used to parse. 29 | /// 30 | /// - returns: The created `Date` instance. 31 | @available(iOS 10.0, OSX 10.12, watchOS 3.0, tvOS 10.0, *) 32 | public func dateInISO8601Format(with options: ISO8601DateFormatter.Options = [.withInternetDateTime]) -> Date? { 33 | let dateFormatter = ISO8601DateFormatter() 34 | dateFormatter.formatOptions = options 35 | 36 | return dateFormatter.date(from: self) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Tests/TimepieceTests/Date+TimepieceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Date+TimepieceTests.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 10/15/16. 6 | // Copyright © 2016 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Timepiece 10 | import XCTest 11 | 12 | class DateTests: XCTestCase { 13 | private var sample: Date { 14 | return Date(year: 2014, month: 8, day: 15, hour: 20, minute: 25, second: 43) 15 | } 16 | 17 | func testYear() { 18 | XCTAssertEqual(sample.year, 2014) 19 | } 20 | 21 | func testMonth() { 22 | XCTAssertEqual(sample.month, 8) 23 | } 24 | 25 | func testDay() { 26 | XCTAssertEqual(sample.day, 15) 27 | } 28 | 29 | func testHour() { 30 | XCTAssertEqual(sample.hour, 20) 31 | } 32 | 33 | func testMinute() { 34 | XCTAssertEqual(sample.minute, 25) 35 | } 36 | 37 | func testSecond() { 38 | XCTAssertEqual(sample.second, 43) 39 | } 40 | 41 | func testNanosecond() { 42 | XCTAssertEqual(sample.nanosecond, 0) 43 | } 44 | 45 | func testWeekday() { 46 | XCTAssertEqual(sample.weekday, 6) 47 | } 48 | 49 | func testInit() { 50 | let heisei = 235 51 | var japaneseCalendar = Calendar(identifier: .japanese) 52 | japaneseCalendar.timeZone = TimeZone(identifier: "Asia/Tokyo")! 53 | let date = Date(era: heisei, year: 26, month: 8, day: 15, hour: 20, minute: 25, second: 43, nanosecond: 0, on: japaneseCalendar) 54 | 55 | var calendar = Calendar(identifier: .gregorian) 56 | calendar.timeZone = TimeZone(identifier: "GMT")! 57 | let dateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond, .weekday], from: date) 58 | XCTAssertEqual(dateComponents.year, 2014) 59 | XCTAssertEqual(dateComponents.month, 8) 60 | XCTAssertEqual(dateComponents.day, 15) 61 | XCTAssertEqual(dateComponents.hour, 11) 62 | XCTAssertEqual(dateComponents.minute, 25) 63 | XCTAssertEqual(dateComponents.second, 43) 64 | XCTAssertEqual(dateComponents.nanosecond, 0) 65 | XCTAssertEqual(dateComponents.weekday, 6) 66 | } 67 | 68 | func testInitForTime() { 69 | let date = Date(year: 2014, month: 8, day: 15, hour: 20, minute: 25, second: 43) 70 | 71 | let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond, .weekday], from: date) 72 | XCTAssertEqual(dateComponents.year, 2014) 73 | XCTAssertEqual(dateComponents.month, 8) 74 | XCTAssertEqual(dateComponents.day, 15) 75 | XCTAssertEqual(dateComponents.hour, 20) 76 | XCTAssertEqual(dateComponents.minute, 25) 77 | XCTAssertEqual(dateComponents.second, 43) 78 | XCTAssertEqual(dateComponents.nanosecond, 0) 79 | XCTAssertEqual(dateComponents.weekday, 6) 80 | } 81 | 82 | func testInitForDate() { 83 | let date = Date(year: 2014, month: 8, day: 15) 84 | 85 | let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second, .nanosecond, .weekday], from: date) 86 | XCTAssertEqual(dateComponents.year, 2014) 87 | XCTAssertEqual(dateComponents.month, 8) 88 | XCTAssertEqual(dateComponents.day, 15) 89 | XCTAssertEqual(dateComponents.weekday, 6) 90 | } 91 | 92 | func testToday() { 93 | let today = Date.today() 94 | let now = Date() 95 | 96 | XCTAssertEqual(today.year, now.year) 97 | XCTAssertEqual(today.month, now.month) 98 | XCTAssertEqual(today.day, now.day) 99 | XCTAssertEqual(today.hour, 0) 100 | XCTAssertEqual(today.minute, 0) 101 | XCTAssertEqual(today.second, 0) 102 | } 103 | 104 | func testYesterday() { 105 | let yesterday = Date.yesterday() 106 | let date = Date() - 1.day 107 | 108 | XCTAssertEqual(yesterday.year, date?.year) 109 | XCTAssertEqual(yesterday.month, date?.month) 110 | XCTAssertEqual(yesterday.day, date?.day) 111 | XCTAssertEqual(yesterday.hour, 0) 112 | XCTAssertEqual(yesterday.minute, 0) 113 | XCTAssertEqual(yesterday.second, 0) 114 | } 115 | 116 | func testTomorrow() { 117 | let tomorrow = Date.tomorrow() 118 | let date = Date() + 1.day 119 | 120 | XCTAssertEqual(tomorrow.year, date?.year) 121 | XCTAssertEqual(tomorrow.month, date?.month) 122 | XCTAssertEqual(tomorrow.day, date?.day) 123 | XCTAssertEqual(tomorrow.hour, 0) 124 | XCTAssertEqual(tomorrow.minute, 0) 125 | XCTAssertEqual(tomorrow.second, 0) 126 | } 127 | 128 | func testPlusDateComponents() { 129 | let date = Date(year: 2016, month: 1, day: 1) 130 | 131 | var dateComponents = DateComponents() 132 | dateComponents.month = 1 133 | 134 | let added = date + dateComponents 135 | XCTAssertEqual(added?.month, 2) 136 | } 137 | 138 | func testMinusDateComponents() { 139 | let date = Date(year: 2016, month: 1, day: 1) 140 | 141 | var dateComponents = DateComponents() 142 | dateComponents.month = 1 143 | 144 | let added = date - dateComponents 145 | XCTAssertEqual(added?.month, 12) 146 | } 147 | 148 | func testChanged() { 149 | let date = Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 150 | let newDate = date.changed(year: 2017) 151 | 152 | XCTAssertEqual(newDate?.year, 2017) 153 | XCTAssertEqual(newDate?.month, 8) 154 | XCTAssertEqual(newDate?.day, 14) 155 | XCTAssertEqual(newDate?.hour, 20) 156 | XCTAssertEqual(newDate?.minute, 25) 157 | XCTAssertEqual(newDate?.second, 43) 158 | XCTAssertEqual(newDate?.nanosecond, 0) 159 | } 160 | 161 | func testChangedByWeekday() { 162 | let date = Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 163 | let newDate = date.changed(weekday: 7) 164 | 165 | XCTAssertEqual(newDate?.year, 2014) 166 | XCTAssertEqual(newDate?.month, 8) 167 | XCTAssertEqual(newDate?.day, 16) 168 | XCTAssertEqual(newDate?.hour, 20) 169 | XCTAssertEqual(newDate?.minute, 25) 170 | XCTAssertEqual(newDate?.second, 43) 171 | XCTAssertEqual(newDate?.nanosecond, 0) 172 | } 173 | 174 | func testTruncated() { 175 | let date = Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 176 | let newDate = date.truncated([.hour, .minute, .second, .nanosecond]) 177 | 178 | XCTAssertEqual(newDate?.year, 2014) 179 | XCTAssertEqual(newDate?.month, 8) 180 | XCTAssertEqual(newDate?.day, 14) 181 | XCTAssertEqual(newDate?.hour, 0) 182 | XCTAssertEqual(newDate?.minute, 0) 183 | XCTAssertEqual(newDate?.second, 0) 184 | XCTAssertEqual(newDate?.nanosecond, 0) 185 | } 186 | 187 | func testTruncatedFrom() { 188 | let date = Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 189 | let newDate = date.truncated(from: .month) 190 | 191 | XCTAssertEqual(newDate?.year, 2014) 192 | XCTAssertEqual(newDate?.month, 1) 193 | XCTAssertEqual(newDate?.day, 1) 194 | XCTAssertEqual(newDate?.hour, 0) 195 | XCTAssertEqual(newDate?.minute, 0) 196 | XCTAssertEqual(newDate?.second, 0) 197 | XCTAssertEqual(newDate?.nanosecond, 0) 198 | } 199 | 200 | func testStringInStyles() { 201 | let sampleString = sample.stringIn(dateStyle: .short, timeStyle: .short) 202 | XCTAssertEqual(sampleString, "8/15/14, 8:25 PM") 203 | } 204 | 205 | func testDateString() { 206 | let sampleString = sample.dateString(in: .short) 207 | XCTAssertEqual(sampleString, "8/15/14") 208 | } 209 | 210 | func testTimeString() { 211 | let sampleString = sample.timeString(in: .short) 212 | XCTAssertEqual(sampleString, "8:25 PM") 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /Tests/TimepieceTests/DateComponents+TimepieceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateComponents+TimepieceTests.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 10/16/16. 6 | // Copyright © 2016 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Timepiece 11 | import XCTest 12 | 13 | class DateComponentsTests: XCTestCase { 14 | func testAgo() { 15 | var dateComponents = DateComponents() 16 | dateComponents.year = 1 17 | 18 | XCTAssertEqual(dateComponents.ago?.year, Date().year - 1) 19 | } 20 | 21 | func testLater() { 22 | var dateComponents = DateComponents() 23 | dateComponents.year = 1 24 | 25 | XCTAssertEqual(dateComponents.later?.year, Date().year + 1) 26 | } 27 | 28 | func testMinusPrefix() { 29 | var dateComponents = DateComponents() 30 | dateComponents.year = 1 31 | dateComponents.month = 1 32 | dateComponents.day = 1 33 | dateComponents.hour = 1 34 | dateComponents.minute = 1 35 | dateComponents.second = 1 36 | dateComponents.nanosecond = 1 37 | 38 | let inverse = -dateComponents 39 | XCTAssertEqual(inverse.year, -1) 40 | XCTAssertEqual(inverse.month, -1) 41 | XCTAssertEqual(inverse.day, -1) 42 | XCTAssertEqual(inverse.hour, -1) 43 | XCTAssertEqual(inverse.minute, -1) 44 | XCTAssertEqual(inverse.second, -1) 45 | XCTAssertEqual(inverse.nanosecond, -1) 46 | } 47 | 48 | func testPlusDateComponents() { 49 | var dateComponents1 = DateComponents() 50 | dateComponents1.year = 1 51 | 52 | var dateComponents2 = DateComponents() 53 | dateComponents2.month = 1 54 | 55 | let added = dateComponents1 + dateComponents2 56 | XCTAssertEqual(added.year, 1) 57 | XCTAssertEqual(added.month, 1) 58 | } 59 | 60 | func testMinusDateComponents() { 61 | var dateComponents1 = DateComponents() 62 | dateComponents1.year = 1 63 | 64 | var dateComponents2 = DateComponents() 65 | dateComponents2.month = 1 66 | 67 | let subtracted = dateComponents1 - dateComponents2 68 | XCTAssertEqual(subtracted.year, 1) 69 | XCTAssertEqual(subtracted.month, -1) 70 | } 71 | 72 | func testStringInUnitsStyle() { 73 | var dateComponents = DateComponents() 74 | dateComponents.hour = 3 75 | dateComponents.minute = 0 76 | dateComponents.second = 5 77 | 78 | XCTAssertEqual(dateComponents.string(in: .positional), "3:00:05") 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Tests/TimepieceTests/Int+TimepieceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Int+TimepieceTests.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 2014/08/15. 6 | // Copyright (c) 2014年 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Timepiece 10 | import XCTest 11 | 12 | class IntTestCase: XCTestCase { 13 | func testYear() { 14 | XCTAssertEqual(1.year.year, 1) 15 | } 16 | 17 | func testMonth() { 18 | XCTAssertEqual(1.month.month, 1) 19 | } 20 | 21 | func testWeek() { 22 | XCTAssertEqual(1.week.day, 7) 23 | } 24 | 25 | func testDay() { 26 | XCTAssertEqual(1.day.day, 1) 27 | } 28 | 29 | func testHour() { 30 | XCTAssertEqual(1.hour.hour, 1) 31 | } 32 | 33 | func testMinute() { 34 | XCTAssertEqual(1.minute.minute, 1) 35 | } 36 | 37 | func testSecond() { 38 | XCTAssertEqual(1.second.second, 1) 39 | } 40 | 41 | func testNanosecond() { 42 | XCTAssertEqual(1.nanosecond.nanosecond, 1) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Tests/TimepieceTests/String+TimepieceTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+TimepieceTests.swift 3 | // Timepiece 4 | // 5 | // Created by Naoto Kaneko on 2015/03/01. 6 | // Copyright (c) 2015年 Naoto Kaneko. All rights reserved. 7 | // 8 | 9 | import Timepiece 10 | import XCTest 11 | 12 | class StringTests: XCTestCase { 13 | func testDateInFormat() { 14 | let date = "2014-08-15T20:25:43+0900".date(inFormat: "yyyy-MM-dd'T'HH:mm:ssZ") 15 | XCTAssertEqual(date?.year, 2014) 16 | XCTAssertEqual(date?.month, 8) 17 | XCTAssertEqual(date?.day, 15) 18 | } 19 | 20 | @available(iOS 10.0, OSX 10.12, tvOS 10.0, *) 21 | func testDateInISO8601Format() { 22 | let date = "2014-08-15T20:25:43+0900".dateInISO8601Format() 23 | XCTAssertEqual(date?.year, 2014) 24 | XCTAssertEqual(date?.month, 8) 25 | XCTAssertEqual(date?.day, 15) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Timepiece.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import Timepiece 3 | 4 | let now = Date() 5 | 6 | // Initializer 7 | Date(era: 235, year: 26, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0, on: Calendar(identifier: .japanese)) 8 | Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43, nanosecond: 0) 9 | Date(year: 2014, month: 8, day: 14, hour: 20, minute: 25, second: 43) 10 | Date(year: 2014, month: 8, day: 14) 11 | 12 | Date.today() 13 | Date.yesterday() 14 | Date.tomorrow() 15 | 16 | // The properties of Date 17 | now.year 18 | now.month 19 | now.weekday 20 | now.day 21 | now.hour 22 | now.minute 23 | now.second 24 | now.nanosecond 25 | 26 | // Calculation 27 | now + 1.year 28 | now - 2.months 29 | now + (3.weeks - 4.days + 5.hours) 30 | 31 | 1.year.later 32 | 1.year.ago 33 | 34 | // Change 35 | now.changed(year: 2014) 36 | now.changed(weekday: 1) 37 | now.truncated([.minute, .second, .nanosecond]) 38 | now.truncated(from: .day) 39 | 40 | // Format 41 | now.stringIn(dateStyle: .long, timeStyle: .medium) 42 | now.dateString(in: .medium) 43 | now.timeString(in: .short) 44 | 45 | 3.days.string(in: .full) 46 | 47 | // Parse 48 | "2014/8/14".date(inFormat: "yyyy/MM/dd") 49 | "2014-08-14T20:25:43+0900".dateInISO8601Format() 50 | -------------------------------------------------------------------------------- /Timepiece.playground/Sources/SupportCode.swift: -------------------------------------------------------------------------------- 1 | // 2 | // This file (and all other Swift source files in the Sources directory of this playground) will be precompiled into a framework which is automatically made available to Timepiece.playground. 3 | // 4 | -------------------------------------------------------------------------------- /Timepiece.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Timepiece.playground/playground.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Timepiece.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "Timepiece" 3 | s.version = "1.3.1" 4 | s.summary = "Intuitive date handling in Swift" 5 | s.homepage = "https://github.com/naoty/Timepiece" 6 | s.license = { :type => "MIT", :file => "LICENSE" } 7 | s.author = { "Naoto Kaneko" => "naoty.k@gmail.com" } 8 | 9 | s.ios.deployment_target = "8.0" 10 | s.osx.deployment_target = "10.9" 11 | s.watchos.deployment_target = "2.0" 12 | s.tvos.deployment_target = "9.0" 13 | 14 | s.source = { :git => "https://github.com/naoty/Timepiece.git", :tag => s.version } 15 | s.source_files = "Sources/**/*.swift" 16 | s.requires_arc = true 17 | s.swift_version = '5.0' 18 | end 19 | 20 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/Timepiece-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 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/TimepieceTests-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 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3D49D4901DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */; }; 11 | 3D49D4911DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */; }; 12 | 3D49D4921DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */; }; 13 | 3D49D4931DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */; }; 14 | 3DA1DC8B1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */; }; 15 | 3DA1DC8C1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */; }; 16 | 3DA1DC8D1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */; }; 17 | 3DA1DC8E1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */; }; 18 | 3DE7CFCB1B2712F400E0F331 /* Int+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */; }; 19 | 3DE7CFCE1B2712F400E0F331 /* String+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4453381AA2C4B900199949 /* String+Timepiece.swift */; }; 20 | 3DE7CFD91B27131A00E0F331 /* Int+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */; }; 21 | 3DE7CFDC1B27131A00E0F331 /* String+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4453381AA2C4B900199949 /* String+Timepiece.swift */; }; 22 | 43D08A821E4F878700BE400A /* Date+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7A1E4F877700BE400A /* Date+TimepieceTests.swift */; }; 23 | 43D08A831E4F878700BE400A /* DateComponents+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7B1E4F877700BE400A /* DateComponents+TimepieceTests.swift */; }; 24 | 43D08A841E4F878700BE400A /* Int+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7C1E4F877700BE400A /* Int+TimepieceTests.swift */; }; 25 | 43D08A851E4F878700BE400A /* String+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7D1E4F877700BE400A /* String+TimepieceTests.swift */; }; 26 | 43D08A861E4F878800BE400A /* Date+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7A1E4F877700BE400A /* Date+TimepieceTests.swift */; }; 27 | 43D08A871E4F878800BE400A /* DateComponents+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7B1E4F877700BE400A /* DateComponents+TimepieceTests.swift */; }; 28 | 43D08A881E4F878800BE400A /* Int+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7C1E4F877700BE400A /* Int+TimepieceTests.swift */; }; 29 | 43D08A891E4F878800BE400A /* String+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7D1E4F877700BE400A /* String+TimepieceTests.swift */; }; 30 | 43D08A8A1E4F878800BE400A /* Date+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7A1E4F877700BE400A /* Date+TimepieceTests.swift */; }; 31 | 43D08A8B1E4F878800BE400A /* DateComponents+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7B1E4F877700BE400A /* DateComponents+TimepieceTests.swift */; }; 32 | 43D08A8C1E4F878800BE400A /* Int+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7C1E4F877700BE400A /* Int+TimepieceTests.swift */; }; 33 | 43D08A8D1E4F878800BE400A /* String+TimepieceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43D08A7D1E4F877700BE400A /* String+TimepieceTests.swift */; }; 34 | 8015E21C1BB9B44C00545DF5 /* Int+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */; }; 35 | 8015E21F1BB9B44C00545DF5 /* String+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4453381AA2C4B900199949 /* String+Timepiece.swift */; }; 36 | 8061C2A41BB9B62200F0494D /* Timepiece.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8061C29A1BB9B62200F0494D /* Timepiece.framework */; }; 37 | 8061C2B31BB9B65B00F0494D /* Int+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */; }; 38 | 8061C2B61BB9B65B00F0494D /* String+Timepiece.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D4453381AA2C4B900199949 /* String+Timepiece.swift */; }; 39 | /* End PBXBuildFile section */ 40 | 41 | /* Begin PBXContainerItemProxy section */ 42 | 3DC6182F199E271500FB7AAC /* PBXContainerItemProxy */ = { 43 | isa = PBXContainerItemProxy; 44 | containerPortal = 3DC61806199E1F8400FB7AAC /* Project object */; 45 | proxyType = 1; 46 | remoteGlobalIDString = 3DC6180E199E1F8400FB7AAC; 47 | remoteInfo = Timepiece; 48 | }; 49 | 3DE7CFBC1B27126F00E0F331 /* PBXContainerItemProxy */ = { 50 | isa = PBXContainerItemProxy; 51 | containerPortal = 3DC61806199E1F8400FB7AAC /* Project object */; 52 | proxyType = 1; 53 | remoteGlobalIDString = 3DE7CFAF1B27126F00E0F331; 54 | remoteInfo = "Timepiece OSX"; 55 | }; 56 | 8061C2A51BB9B62200F0494D /* PBXContainerItemProxy */ = { 57 | isa = PBXContainerItemProxy; 58 | containerPortal = 3DC61806199E1F8400FB7AAC /* Project object */; 59 | proxyType = 1; 60 | remoteGlobalIDString = 8061C2991BB9B62200F0494D; 61 | remoteInfo = "Timepiece tvOS"; 62 | }; 63 | /* End PBXContainerItemProxy section */ 64 | 65 | /* Begin PBXFileReference section */ 66 | 3D4453381AA2C4B900199949 /* String+Timepiece.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+Timepiece.swift"; sourceTree = ""; }; 67 | 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DateComponents+Timepiece.swift"; sourceTree = ""; }; 68 | 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+Timepiece.swift"; sourceTree = ""; }; 69 | 3DC6180F199E1F8400FB7AAC /* Timepiece.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Timepiece.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 70 | 3DC6181A199E1F8400FB7AAC /* Timepiece iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timepiece iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Int+Timepiece.swift"; sourceTree = ""; }; 72 | 3DE7CFB01B27126F00E0F331 /* Timepiece.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Timepiece.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 3DE7CFB31B27126F00E0F331 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 74 | 3DE7CFB41B27126F00E0F331 /* Timepiece OSX.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Timepiece OSX.h"; sourceTree = ""; }; 75 | 3DE7CFBA1B27126F00E0F331 /* Timepiece OSX Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timepiece OSX Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 76 | 3DE7CFC01B27126F00E0F331 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 77 | 3DE7CFC11B27126F00E0F331 /* Timepiece_OSXTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timepiece_OSXTests.swift; sourceTree = ""; }; 78 | 43D08A781E4F85FE00BE400A /* Package.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = ""; }; 79 | 43D08A7A1E4F877700BE400A /* Date+TimepieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Date+TimepieceTests.swift"; sourceTree = ""; }; 80 | 43D08A7B1E4F877700BE400A /* DateComponents+TimepieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DateComponents+TimepieceTests.swift"; sourceTree = ""; }; 81 | 43D08A7C1E4F877700BE400A /* Int+TimepieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Int+TimepieceTests.swift"; sourceTree = ""; }; 82 | 43D08A7D1E4F877700BE400A /* String+TimepieceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String+TimepieceTests.swift"; sourceTree = ""; }; 83 | 8015E2121BB9B41400545DF5 /* Timepiece.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Timepiece.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 84 | 8061C29A1BB9B62200F0494D /* Timepiece.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Timepiece.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 85 | 8061C2A31BB9B62200F0494D /* Timepiece tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Timepiece tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 86 | /* End PBXFileReference section */ 87 | 88 | /* Begin PBXFrameworksBuildPhase section */ 89 | 3DC6180B199E1F8400FB7AAC /* Frameworks */ = { 90 | isa = PBXFrameworksBuildPhase; 91 | buildActionMask = 2147483647; 92 | files = ( 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | 3DC61817199E1F8400FB7AAC /* Frameworks */ = { 97 | isa = PBXFrameworksBuildPhase; 98 | buildActionMask = 2147483647; 99 | files = ( 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | 3DE7CFAC1B27126F00E0F331 /* Frameworks */ = { 104 | isa = PBXFrameworksBuildPhase; 105 | buildActionMask = 2147483647; 106 | files = ( 107 | ); 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | 3DE7CFB71B27126F00E0F331 /* Frameworks */ = { 111 | isa = PBXFrameworksBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | ); 115 | runOnlyForDeploymentPostprocessing = 0; 116 | }; 117 | 8015E20E1BB9B41400545DF5 /* Frameworks */ = { 118 | isa = PBXFrameworksBuildPhase; 119 | buildActionMask = 2147483647; 120 | files = ( 121 | ); 122 | runOnlyForDeploymentPostprocessing = 0; 123 | }; 124 | 8061C2961BB9B62200F0494D /* Frameworks */ = { 125 | isa = PBXFrameworksBuildPhase; 126 | buildActionMask = 2147483647; 127 | files = ( 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | 8061C2A01BB9B62200F0494D /* Frameworks */ = { 132 | isa = PBXFrameworksBuildPhase; 133 | buildActionMask = 2147483647; 134 | files = ( 135 | 8061C2A41BB9B62200F0494D /* Timepiece.framework in Frameworks */, 136 | ); 137 | runOnlyForDeploymentPostprocessing = 0; 138 | }; 139 | /* End PBXFrameworksBuildPhase section */ 140 | 141 | /* Begin PBXGroup section */ 142 | 3DC61805199E1F8400FB7AAC = { 143 | isa = PBXGroup; 144 | children = ( 145 | 43D08A781E4F85FE00BE400A /* Package.swift */, 146 | 3DC61828199E204800FB7AAC /* Sources */, 147 | 3DC61829199E204800FB7AAC /* Tests */, 148 | 3DE7CFB11B27126F00E0F331 /* Timepiece OSX */, 149 | 3DE7CFBE1B27126F00E0F331 /* Timepiece OSXTests */, 150 | 3DC61810199E1F8400FB7AAC /* Products */, 151 | ); 152 | sourceTree = ""; 153 | }; 154 | 3DC61810199E1F8400FB7AAC /* Products */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 3DC6180F199E1F8400FB7AAC /* Timepiece.framework */, 158 | 3DC6181A199E1F8400FB7AAC /* Timepiece iOS Tests.xctest */, 159 | 3DE7CFB01B27126F00E0F331 /* Timepiece.framework */, 160 | 3DE7CFBA1B27126F00E0F331 /* Timepiece OSX Tests.xctest */, 161 | 8061C29A1BB9B62200F0494D /* Timepiece.framework */, 162 | 8061C2A31BB9B62200F0494D /* Timepiece tvOS Tests.xctest */, 163 | 8015E2121BB9B41400545DF5 /* Timepiece.framework */, 164 | ); 165 | name = Products; 166 | sourceTree = ""; 167 | }; 168 | 3DC61828199E204800FB7AAC /* Sources */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 3DA1DC8A1DA143AA00D0A808 /* Date+Timepiece.swift */, 172 | 3D49D48F1DB36C30000EED3F /* DateComponents+Timepiece.swift */, 173 | 3DC6182A199E26CD00FB7AAC /* Int+Timepiece.swift */, 174 | 3D4453381AA2C4B900199949 /* String+Timepiece.swift */, 175 | ); 176 | path = Sources; 177 | sourceTree = ""; 178 | }; 179 | 3DC61829199E204800FB7AAC /* Tests */ = { 180 | isa = PBXGroup; 181 | children = ( 182 | 4351806A22736A5E008BD0C4 /* TimepieceTests */, 183 | ); 184 | path = Tests; 185 | sourceTree = ""; 186 | }; 187 | 3DE7CFB11B27126F00E0F331 /* Timepiece OSX */ = { 188 | isa = PBXGroup; 189 | children = ( 190 | 3DE7CFB41B27126F00E0F331 /* Timepiece OSX.h */, 191 | 3DE7CFB21B27126F00E0F331 /* Supporting Files */, 192 | ); 193 | path = "Timepiece OSX"; 194 | sourceTree = ""; 195 | }; 196 | 3DE7CFB21B27126F00E0F331 /* Supporting Files */ = { 197 | isa = PBXGroup; 198 | children = ( 199 | 3DE7CFB31B27126F00E0F331 /* Info.plist */, 200 | ); 201 | name = "Supporting Files"; 202 | sourceTree = ""; 203 | }; 204 | 3DE7CFBE1B27126F00E0F331 /* Timepiece OSXTests */ = { 205 | isa = PBXGroup; 206 | children = ( 207 | 3DE7CFC11B27126F00E0F331 /* Timepiece_OSXTests.swift */, 208 | 3DE7CFBF1B27126F00E0F331 /* Supporting Files */, 209 | ); 210 | path = "Timepiece OSXTests"; 211 | sourceTree = ""; 212 | }; 213 | 3DE7CFBF1B27126F00E0F331 /* Supporting Files */ = { 214 | isa = PBXGroup; 215 | children = ( 216 | 3DE7CFC01B27126F00E0F331 /* Info.plist */, 217 | ); 218 | name = "Supporting Files"; 219 | sourceTree = ""; 220 | }; 221 | 4351806A22736A5E008BD0C4 /* TimepieceTests */ = { 222 | isa = PBXGroup; 223 | children = ( 224 | 43D08A7A1E4F877700BE400A /* Date+TimepieceTests.swift */, 225 | 43D08A7B1E4F877700BE400A /* DateComponents+TimepieceTests.swift */, 226 | 43D08A7C1E4F877700BE400A /* Int+TimepieceTests.swift */, 227 | 43D08A7D1E4F877700BE400A /* String+TimepieceTests.swift */, 228 | ); 229 | path = TimepieceTests; 230 | sourceTree = ""; 231 | }; 232 | /* End PBXGroup section */ 233 | 234 | /* Begin PBXHeadersBuildPhase section */ 235 | 3DC6180C199E1F8400FB7AAC /* Headers */ = { 236 | isa = PBXHeadersBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | 3DE7CFAD1B27126F00E0F331 /* Headers */ = { 243 | isa = PBXHeadersBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | ); 247 | runOnlyForDeploymentPostprocessing = 0; 248 | }; 249 | 8015E20F1BB9B41400545DF5 /* Headers */ = { 250 | isa = PBXHeadersBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | ); 254 | runOnlyForDeploymentPostprocessing = 0; 255 | }; 256 | 8061C2971BB9B62200F0494D /* Headers */ = { 257 | isa = PBXHeadersBuildPhase; 258 | buildActionMask = 2147483647; 259 | files = ( 260 | ); 261 | runOnlyForDeploymentPostprocessing = 0; 262 | }; 263 | /* End PBXHeadersBuildPhase section */ 264 | 265 | /* Begin PBXNativeTarget section */ 266 | 3DC6180E199E1F8400FB7AAC /* Timepiece iOS */ = { 267 | isa = PBXNativeTarget; 268 | buildConfigurationList = 3DC61822199E1F8400FB7AAC /* Build configuration list for PBXNativeTarget "Timepiece iOS" */; 269 | buildPhases = ( 270 | 3DC6180A199E1F8400FB7AAC /* Sources */, 271 | 3DC6180B199E1F8400FB7AAC /* Frameworks */, 272 | 3DC6180C199E1F8400FB7AAC /* Headers */, 273 | 3DC6180D199E1F8400FB7AAC /* Resources */, 274 | ); 275 | buildRules = ( 276 | ); 277 | dependencies = ( 278 | ); 279 | name = "Timepiece iOS"; 280 | productName = Timepiece; 281 | productReference = 3DC6180F199E1F8400FB7AAC /* Timepiece.framework */; 282 | productType = "com.apple.product-type.framework"; 283 | }; 284 | 3DC61819199E1F8400FB7AAC /* Timepiece iOS Tests */ = { 285 | isa = PBXNativeTarget; 286 | buildConfigurationList = 3DC61825199E1F8400FB7AAC /* Build configuration list for PBXNativeTarget "Timepiece iOS Tests" */; 287 | buildPhases = ( 288 | 3DC61816199E1F8400FB7AAC /* Sources */, 289 | 3DC61817199E1F8400FB7AAC /* Frameworks */, 290 | 3DC61818199E1F8400FB7AAC /* Resources */, 291 | ); 292 | buildRules = ( 293 | ); 294 | dependencies = ( 295 | 3DC61830199E271500FB7AAC /* PBXTargetDependency */, 296 | ); 297 | name = "Timepiece iOS Tests"; 298 | productName = TimepieceTests; 299 | productReference = 3DC6181A199E1F8400FB7AAC /* Timepiece iOS Tests.xctest */; 300 | productType = "com.apple.product-type.bundle.unit-test"; 301 | }; 302 | 3DE7CFAF1B27126F00E0F331 /* Timepiece OSX */ = { 303 | isa = PBXNativeTarget; 304 | buildConfigurationList = 3DE7CFC71B27126F00E0F331 /* Build configuration list for PBXNativeTarget "Timepiece OSX" */; 305 | buildPhases = ( 306 | 3DE7CFAB1B27126F00E0F331 /* Sources */, 307 | 3DE7CFAC1B27126F00E0F331 /* Frameworks */, 308 | 3DE7CFAD1B27126F00E0F331 /* Headers */, 309 | 3DE7CFAE1B27126F00E0F331 /* Resources */, 310 | ); 311 | buildRules = ( 312 | ); 313 | dependencies = ( 314 | ); 315 | name = "Timepiece OSX"; 316 | productName = "Timepiece OSX"; 317 | productReference = 3DE7CFB01B27126F00E0F331 /* Timepiece.framework */; 318 | productType = "com.apple.product-type.framework"; 319 | }; 320 | 3DE7CFB91B27126F00E0F331 /* Timepiece OSX Tests */ = { 321 | isa = PBXNativeTarget; 322 | buildConfigurationList = 3DE7CFC81B27126F00E0F331 /* Build configuration list for PBXNativeTarget "Timepiece OSX Tests" */; 323 | buildPhases = ( 324 | 3DE7CFB61B27126F00E0F331 /* Sources */, 325 | 3DE7CFB71B27126F00E0F331 /* Frameworks */, 326 | 3DE7CFB81B27126F00E0F331 /* Resources */, 327 | ); 328 | buildRules = ( 329 | ); 330 | dependencies = ( 331 | 3DE7CFBD1B27126F00E0F331 /* PBXTargetDependency */, 332 | ); 333 | name = "Timepiece OSX Tests"; 334 | productName = "Timepiece OSXTests"; 335 | productReference = 3DE7CFBA1B27126F00E0F331 /* Timepiece OSX Tests.xctest */; 336 | productType = "com.apple.product-type.bundle.unit-test"; 337 | }; 338 | 8015E2111BB9B41400545DF5 /* Timepiece watchOS */ = { 339 | isa = PBXNativeTarget; 340 | buildConfigurationList = 8015E2191BB9B41400545DF5 /* Build configuration list for PBXNativeTarget "Timepiece watchOS" */; 341 | buildPhases = ( 342 | 8015E20D1BB9B41400545DF5 /* Sources */, 343 | 8015E20E1BB9B41400545DF5 /* Frameworks */, 344 | 8015E20F1BB9B41400545DF5 /* Headers */, 345 | 8015E2101BB9B41400545DF5 /* Resources */, 346 | ); 347 | buildRules = ( 348 | ); 349 | dependencies = ( 350 | ); 351 | name = "Timepiece watchOS"; 352 | productName = "Timepiece watchOS"; 353 | productReference = 8015E2121BB9B41400545DF5 /* Timepiece.framework */; 354 | productType = "com.apple.product-type.framework"; 355 | }; 356 | 8061C2991BB9B62200F0494D /* Timepiece tvOS */ = { 357 | isa = PBXNativeTarget; 358 | buildConfigurationList = 8061C2AF1BB9B62200F0494D /* Build configuration list for PBXNativeTarget "Timepiece tvOS" */; 359 | buildPhases = ( 360 | 8061C2951BB9B62200F0494D /* Sources */, 361 | 8061C2961BB9B62200F0494D /* Frameworks */, 362 | 8061C2971BB9B62200F0494D /* Headers */, 363 | 8061C2981BB9B62200F0494D /* Resources */, 364 | ); 365 | buildRules = ( 366 | ); 367 | dependencies = ( 368 | ); 369 | name = "Timepiece tvOS"; 370 | productName = "Timepiece tvOS"; 371 | productReference = 8061C29A1BB9B62200F0494D /* Timepiece.framework */; 372 | productType = "com.apple.product-type.framework"; 373 | }; 374 | 8061C2A21BB9B62200F0494D /* Timepiece tvOS Tests */ = { 375 | isa = PBXNativeTarget; 376 | buildConfigurationList = 8061C2B01BB9B62200F0494D /* Build configuration list for PBXNativeTarget "Timepiece tvOS Tests" */; 377 | buildPhases = ( 378 | 8061C29F1BB9B62200F0494D /* Sources */, 379 | 8061C2A01BB9B62200F0494D /* Frameworks */, 380 | 8061C2A11BB9B62200F0494D /* Resources */, 381 | ); 382 | buildRules = ( 383 | ); 384 | dependencies = ( 385 | 8061C2A61BB9B62200F0494D /* PBXTargetDependency */, 386 | ); 387 | name = "Timepiece tvOS Tests"; 388 | productName = "Timepiece tvOSTests"; 389 | productReference = 8061C2A31BB9B62200F0494D /* Timepiece tvOS Tests.xctest */; 390 | productType = "com.apple.product-type.bundle.unit-test"; 391 | }; 392 | /* End PBXNativeTarget section */ 393 | 394 | /* Begin PBXProject section */ 395 | 3DC61806199E1F8400FB7AAC /* Project object */ = { 396 | isa = PBXProject; 397 | attributes = { 398 | LastSwiftMigration = 0700; 399 | LastSwiftUpdateCheck = 0700; 400 | LastUpgradeCheck = 1020; 401 | ORGANIZATIONNAME = "Naoto Kaneko"; 402 | TargetAttributes = { 403 | 3DC6180E199E1F8400FB7AAC = { 404 | CreatedOnToolsVersion = 6.0; 405 | LastSwiftMigration = 0900; 406 | }; 407 | 3DC61819199E1F8400FB7AAC = { 408 | CreatedOnToolsVersion = 6.0; 409 | LastSwiftMigration = 0900; 410 | }; 411 | 3DE7CFAF1B27126F00E0F331 = { 412 | CreatedOnToolsVersion = 6.3.2; 413 | LastSwiftMigration = 0800; 414 | ProvisioningStyle = Manual; 415 | }; 416 | 3DE7CFB91B27126F00E0F331 = { 417 | CreatedOnToolsVersion = 6.3.2; 418 | LastSwiftMigration = 0800; 419 | ProvisioningStyle = Manual; 420 | }; 421 | 8015E2111BB9B41400545DF5 = { 422 | CreatedOnToolsVersion = 7.0; 423 | }; 424 | 8061C2991BB9B62200F0494D = { 425 | CreatedOnToolsVersion = 7.1; 426 | LastSwiftMigration = 0800; 427 | }; 428 | 8061C2A21BB9B62200F0494D = { 429 | CreatedOnToolsVersion = 7.1; 430 | LastSwiftMigration = 0800; 431 | }; 432 | }; 433 | }; 434 | buildConfigurationList = 3DC61809199E1F8400FB7AAC /* Build configuration list for PBXProject "Timepiece" */; 435 | compatibilityVersion = "Xcode 3.2"; 436 | developmentRegion = en; 437 | hasScannedForEncodings = 0; 438 | knownRegions = ( 439 | en, 440 | Base, 441 | ); 442 | mainGroup = 3DC61805199E1F8400FB7AAC; 443 | productRefGroup = 3DC61810199E1F8400FB7AAC /* Products */; 444 | projectDirPath = ""; 445 | projectRoot = ""; 446 | targets = ( 447 | 3DC6180E199E1F8400FB7AAC /* Timepiece iOS */, 448 | 3DE7CFAF1B27126F00E0F331 /* Timepiece OSX */, 449 | 8015E2111BB9B41400545DF5 /* Timepiece watchOS */, 450 | 8061C2991BB9B62200F0494D /* Timepiece tvOS */, 451 | 3DC61819199E1F8400FB7AAC /* Timepiece iOS Tests */, 452 | 3DE7CFB91B27126F00E0F331 /* Timepiece OSX Tests */, 453 | 8061C2A21BB9B62200F0494D /* Timepiece tvOS Tests */, 454 | ); 455 | }; 456 | /* End PBXProject section */ 457 | 458 | /* Begin PBXResourcesBuildPhase section */ 459 | 3DC6180D199E1F8400FB7AAC /* Resources */ = { 460 | isa = PBXResourcesBuildPhase; 461 | buildActionMask = 2147483647; 462 | files = ( 463 | ); 464 | runOnlyForDeploymentPostprocessing = 0; 465 | }; 466 | 3DC61818199E1F8400FB7AAC /* Resources */ = { 467 | isa = PBXResourcesBuildPhase; 468 | buildActionMask = 2147483647; 469 | files = ( 470 | ); 471 | runOnlyForDeploymentPostprocessing = 0; 472 | }; 473 | 3DE7CFAE1B27126F00E0F331 /* Resources */ = { 474 | isa = PBXResourcesBuildPhase; 475 | buildActionMask = 2147483647; 476 | files = ( 477 | ); 478 | runOnlyForDeploymentPostprocessing = 0; 479 | }; 480 | 3DE7CFB81B27126F00E0F331 /* Resources */ = { 481 | isa = PBXResourcesBuildPhase; 482 | buildActionMask = 2147483647; 483 | files = ( 484 | ); 485 | runOnlyForDeploymentPostprocessing = 0; 486 | }; 487 | 8015E2101BB9B41400545DF5 /* Resources */ = { 488 | isa = PBXResourcesBuildPhase; 489 | buildActionMask = 2147483647; 490 | files = ( 491 | ); 492 | runOnlyForDeploymentPostprocessing = 0; 493 | }; 494 | 8061C2981BB9B62200F0494D /* Resources */ = { 495 | isa = PBXResourcesBuildPhase; 496 | buildActionMask = 2147483647; 497 | files = ( 498 | ); 499 | runOnlyForDeploymentPostprocessing = 0; 500 | }; 501 | 8061C2A11BB9B62200F0494D /* Resources */ = { 502 | isa = PBXResourcesBuildPhase; 503 | buildActionMask = 2147483647; 504 | files = ( 505 | ); 506 | runOnlyForDeploymentPostprocessing = 0; 507 | }; 508 | /* End PBXResourcesBuildPhase section */ 509 | 510 | /* Begin PBXSourcesBuildPhase section */ 511 | 3DC6180A199E1F8400FB7AAC /* Sources */ = { 512 | isa = PBXSourcesBuildPhase; 513 | buildActionMask = 2147483647; 514 | files = ( 515 | 3DE7CFD91B27131A00E0F331 /* Int+Timepiece.swift in Sources */, 516 | 3DE7CFDC1B27131A00E0F331 /* String+Timepiece.swift in Sources */, 517 | 3D49D4901DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */, 518 | 3DA1DC8B1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */, 519 | ); 520 | runOnlyForDeploymentPostprocessing = 0; 521 | }; 522 | 3DC61816199E1F8400FB7AAC /* Sources */ = { 523 | isa = PBXSourcesBuildPhase; 524 | buildActionMask = 2147483647; 525 | files = ( 526 | 43D08A851E4F878700BE400A /* String+TimepieceTests.swift in Sources */, 527 | 43D08A841E4F878700BE400A /* Int+TimepieceTests.swift in Sources */, 528 | 43D08A821E4F878700BE400A /* Date+TimepieceTests.swift in Sources */, 529 | 43D08A831E4F878700BE400A /* DateComponents+TimepieceTests.swift in Sources */, 530 | ); 531 | runOnlyForDeploymentPostprocessing = 0; 532 | }; 533 | 3DE7CFAB1B27126F00E0F331 /* Sources */ = { 534 | isa = PBXSourcesBuildPhase; 535 | buildActionMask = 2147483647; 536 | files = ( 537 | 3DE7CFCB1B2712F400E0F331 /* Int+Timepiece.swift in Sources */, 538 | 3DE7CFCE1B2712F400E0F331 /* String+Timepiece.swift in Sources */, 539 | 3D49D4911DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */, 540 | 3DA1DC8C1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */, 541 | ); 542 | runOnlyForDeploymentPostprocessing = 0; 543 | }; 544 | 3DE7CFB61B27126F00E0F331 /* Sources */ = { 545 | isa = PBXSourcesBuildPhase; 546 | buildActionMask = 2147483647; 547 | files = ( 548 | 43D08A891E4F878800BE400A /* String+TimepieceTests.swift in Sources */, 549 | 43D08A881E4F878800BE400A /* Int+TimepieceTests.swift in Sources */, 550 | 43D08A861E4F878800BE400A /* Date+TimepieceTests.swift in Sources */, 551 | 43D08A871E4F878800BE400A /* DateComponents+TimepieceTests.swift in Sources */, 552 | ); 553 | runOnlyForDeploymentPostprocessing = 0; 554 | }; 555 | 8015E20D1BB9B41400545DF5 /* Sources */ = { 556 | isa = PBXSourcesBuildPhase; 557 | buildActionMask = 2147483647; 558 | files = ( 559 | 8015E21F1BB9B44C00545DF5 /* String+Timepiece.swift in Sources */, 560 | 3D49D4921DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */, 561 | 8015E21C1BB9B44C00545DF5 /* Int+Timepiece.swift in Sources */, 562 | 3DA1DC8D1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */, 563 | ); 564 | runOnlyForDeploymentPostprocessing = 0; 565 | }; 566 | 8061C2951BB9B62200F0494D /* Sources */ = { 567 | isa = PBXSourcesBuildPhase; 568 | buildActionMask = 2147483647; 569 | files = ( 570 | 8061C2B61BB9B65B00F0494D /* String+Timepiece.swift in Sources */, 571 | 3D49D4931DB36C30000EED3F /* DateComponents+Timepiece.swift in Sources */, 572 | 8061C2B31BB9B65B00F0494D /* Int+Timepiece.swift in Sources */, 573 | 3DA1DC8E1DA143AA00D0A808 /* Date+Timepiece.swift in Sources */, 574 | ); 575 | runOnlyForDeploymentPostprocessing = 0; 576 | }; 577 | 8061C29F1BB9B62200F0494D /* Sources */ = { 578 | isa = PBXSourcesBuildPhase; 579 | buildActionMask = 2147483647; 580 | files = ( 581 | 43D08A8D1E4F878800BE400A /* String+TimepieceTests.swift in Sources */, 582 | 43D08A8C1E4F878800BE400A /* Int+TimepieceTests.swift in Sources */, 583 | 43D08A8A1E4F878800BE400A /* Date+TimepieceTests.swift in Sources */, 584 | 43D08A8B1E4F878800BE400A /* DateComponents+TimepieceTests.swift in Sources */, 585 | ); 586 | runOnlyForDeploymentPostprocessing = 0; 587 | }; 588 | /* End PBXSourcesBuildPhase section */ 589 | 590 | /* Begin PBXTargetDependency section */ 591 | 3DC61830199E271500FB7AAC /* PBXTargetDependency */ = { 592 | isa = PBXTargetDependency; 593 | target = 3DC6180E199E1F8400FB7AAC /* Timepiece iOS */; 594 | targetProxy = 3DC6182F199E271500FB7AAC /* PBXContainerItemProxy */; 595 | }; 596 | 3DE7CFBD1B27126F00E0F331 /* PBXTargetDependency */ = { 597 | isa = PBXTargetDependency; 598 | target = 3DE7CFAF1B27126F00E0F331 /* Timepiece OSX */; 599 | targetProxy = 3DE7CFBC1B27126F00E0F331 /* PBXContainerItemProxy */; 600 | }; 601 | 8061C2A61BB9B62200F0494D /* PBXTargetDependency */ = { 602 | isa = PBXTargetDependency; 603 | target = 8061C2991BB9B62200F0494D /* Timepiece tvOS */; 604 | targetProxy = 8061C2A51BB9B62200F0494D /* PBXContainerItemProxy */; 605 | }; 606 | /* End PBXTargetDependency section */ 607 | 608 | /* Begin XCBuildConfiguration section */ 609 | 3DC61820199E1F8400FB7AAC /* Debug */ = { 610 | isa = XCBuildConfiguration; 611 | buildSettings = { 612 | ALWAYS_SEARCH_USER_PATHS = NO; 613 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 614 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 615 | CLANG_CXX_LIBRARY = "libc++"; 616 | CLANG_ENABLE_MODULES = YES; 617 | CLANG_ENABLE_OBJC_ARC = YES; 618 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 619 | CLANG_WARN_BOOL_CONVERSION = YES; 620 | CLANG_WARN_COMMA = YES; 621 | CLANG_WARN_CONSTANT_CONVERSION = YES; 622 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 623 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 624 | CLANG_WARN_EMPTY_BODY = YES; 625 | CLANG_WARN_ENUM_CONVERSION = YES; 626 | CLANG_WARN_INFINITE_RECURSION = YES; 627 | CLANG_WARN_INT_CONVERSION = YES; 628 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 629 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 630 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 631 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 632 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 633 | CLANG_WARN_STRICT_PROTOTYPES = YES; 634 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 635 | CLANG_WARN_UNREACHABLE_CODE = YES; 636 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 637 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 638 | COPY_PHASE_STRIP = NO; 639 | CURRENT_PROJECT_VERSION = 1; 640 | ENABLE_STRICT_OBJC_MSGSEND = YES; 641 | ENABLE_TESTABILITY = YES; 642 | GCC_C_LANGUAGE_STANDARD = gnu99; 643 | GCC_DYNAMIC_NO_PIC = NO; 644 | GCC_NO_COMMON_BLOCKS = YES; 645 | GCC_OPTIMIZATION_LEVEL = 0; 646 | GCC_PREPROCESSOR_DEFINITIONS = ( 647 | "DEBUG=1", 648 | "$(inherited)", 649 | ); 650 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 651 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 652 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 653 | GCC_WARN_UNDECLARED_SELECTOR = YES; 654 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 655 | GCC_WARN_UNUSED_FUNCTION = YES; 656 | GCC_WARN_UNUSED_VARIABLE = YES; 657 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 658 | MACOSX_DEPLOYMENT_TARGET = 10.9; 659 | MTL_ENABLE_DEBUG_INFO = YES; 660 | ONLY_ACTIVE_ARCH = YES; 661 | SDKROOT = iphoneos; 662 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 663 | SWIFT_VERSION = 5.0; 664 | TARGETED_DEVICE_FAMILY = "1,2"; 665 | VERSIONING_SYSTEM = "apple-generic"; 666 | VERSION_INFO_PREFIX = ""; 667 | }; 668 | name = Debug; 669 | }; 670 | 3DC61821199E1F8400FB7AAC /* Release */ = { 671 | isa = XCBuildConfiguration; 672 | buildSettings = { 673 | ALWAYS_SEARCH_USER_PATHS = NO; 674 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 675 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 676 | CLANG_CXX_LIBRARY = "libc++"; 677 | CLANG_ENABLE_MODULES = YES; 678 | CLANG_ENABLE_OBJC_ARC = YES; 679 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 680 | CLANG_WARN_BOOL_CONVERSION = YES; 681 | CLANG_WARN_COMMA = YES; 682 | CLANG_WARN_CONSTANT_CONVERSION = YES; 683 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 684 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 685 | CLANG_WARN_EMPTY_BODY = YES; 686 | CLANG_WARN_ENUM_CONVERSION = YES; 687 | CLANG_WARN_INFINITE_RECURSION = YES; 688 | CLANG_WARN_INT_CONVERSION = YES; 689 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 690 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 691 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 692 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 693 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 694 | CLANG_WARN_STRICT_PROTOTYPES = YES; 695 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 696 | CLANG_WARN_UNREACHABLE_CODE = YES; 697 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 698 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 699 | COPY_PHASE_STRIP = YES; 700 | CURRENT_PROJECT_VERSION = 1; 701 | ENABLE_NS_ASSERTIONS = NO; 702 | ENABLE_STRICT_OBJC_MSGSEND = YES; 703 | GCC_C_LANGUAGE_STANDARD = gnu99; 704 | GCC_NO_COMMON_BLOCKS = YES; 705 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 706 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 707 | GCC_WARN_UNDECLARED_SELECTOR = YES; 708 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 709 | GCC_WARN_UNUSED_FUNCTION = YES; 710 | GCC_WARN_UNUSED_VARIABLE = YES; 711 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 712 | MACOSX_DEPLOYMENT_TARGET = 10.9; 713 | MTL_ENABLE_DEBUG_INFO = NO; 714 | SDKROOT = iphoneos; 715 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 716 | SWIFT_VERSION = 5.0; 717 | TARGETED_DEVICE_FAMILY = "1,2"; 718 | VALIDATE_PRODUCT = YES; 719 | VERSIONING_SYSTEM = "apple-generic"; 720 | VERSION_INFO_PREFIX = ""; 721 | }; 722 | name = Release; 723 | }; 724 | 3DC61823199E1F8400FB7AAC /* Debug */ = { 725 | isa = XCBuildConfiguration; 726 | buildSettings = { 727 | APPLICATION_EXTENSION_API_ONLY = YES; 728 | CLANG_ENABLE_MODULES = YES; 729 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 730 | DEFINES_MODULE = YES; 731 | DYLIB_COMPATIBILITY_VERSION = 1; 732 | DYLIB_CURRENT_VERSION = 1; 733 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 734 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 735 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 736 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 737 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 738 | PRODUCT_NAME = Timepiece; 739 | SKIP_INSTALL = YES; 740 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 741 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 742 | SWIFT_VERSION = 5.0; 743 | }; 744 | name = Debug; 745 | }; 746 | 3DC61824199E1F8400FB7AAC /* Release */ = { 747 | isa = XCBuildConfiguration; 748 | buildSettings = { 749 | APPLICATION_EXTENSION_API_ONLY = YES; 750 | CLANG_ENABLE_MODULES = YES; 751 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 752 | DEFINES_MODULE = YES; 753 | DYLIB_COMPATIBILITY_VERSION = 1; 754 | DYLIB_CURRENT_VERSION = 1; 755 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 756 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 757 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 758 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 759 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 760 | PRODUCT_NAME = Timepiece; 761 | SKIP_INSTALL = YES; 762 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 763 | SWIFT_VERSION = 5.0; 764 | }; 765 | name = Release; 766 | }; 767 | 3DC61826199E1F8400FB7AAC /* Debug */ = { 768 | isa = XCBuildConfiguration; 769 | buildSettings = { 770 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 771 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 772 | GCC_PREPROCESSOR_DEFINITIONS = ( 773 | "DEBUG=1", 774 | "$(inherited)", 775 | ); 776 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 777 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 778 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 779 | PRODUCT_NAME = "$(TARGET_NAME)"; 780 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 781 | SWIFT_VERSION = 5.0; 782 | }; 783 | name = Debug; 784 | }; 785 | 3DC61827199E1F8400FB7AAC /* Release */ = { 786 | isa = XCBuildConfiguration; 787 | buildSettings = { 788 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 789 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 790 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 791 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 792 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 793 | PRODUCT_NAME = "$(TARGET_NAME)"; 794 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 795 | SWIFT_VERSION = 5.0; 796 | }; 797 | name = Release; 798 | }; 799 | 3DE7CFC31B27126F00E0F331 /* Debug */ = { 800 | isa = XCBuildConfiguration; 801 | buildSettings = { 802 | APPLICATION_EXTENSION_API_ONLY = YES; 803 | COMBINE_HIDPI_IMAGES = YES; 804 | DEBUG_INFORMATION_FORMAT = dwarf; 805 | DEFINES_MODULE = YES; 806 | DYLIB_COMPATIBILITY_VERSION = 1; 807 | DYLIB_CURRENT_VERSION = 1; 808 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 809 | FRAMEWORK_VERSION = A; 810 | GCC_NO_COMMON_BLOCKS = YES; 811 | GCC_PREPROCESSOR_DEFINITIONS = ( 812 | "DEBUG=1", 813 | "$(inherited)", 814 | ); 815 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 816 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 817 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 818 | MACOSX_DEPLOYMENT_TARGET = 10.9; 819 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 820 | PRODUCT_NAME = Timepiece; 821 | SDKROOT = macosx; 822 | SKIP_INSTALL = YES; 823 | SWIFT_VERSION = 5.0; 824 | }; 825 | name = Debug; 826 | }; 827 | 3DE7CFC41B27126F00E0F331 /* Release */ = { 828 | isa = XCBuildConfiguration; 829 | buildSettings = { 830 | APPLICATION_EXTENSION_API_ONLY = YES; 831 | COMBINE_HIDPI_IMAGES = YES; 832 | COPY_PHASE_STRIP = NO; 833 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 834 | DEFINES_MODULE = YES; 835 | DYLIB_COMPATIBILITY_VERSION = 1; 836 | DYLIB_CURRENT_VERSION = 1; 837 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 838 | FRAMEWORK_VERSION = A; 839 | GCC_NO_COMMON_BLOCKS = YES; 840 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 841 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 842 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 843 | MACOSX_DEPLOYMENT_TARGET = 10.9; 844 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 845 | PRODUCT_NAME = Timepiece; 846 | SDKROOT = macosx; 847 | SKIP_INSTALL = YES; 848 | SWIFT_VERSION = 5.0; 849 | }; 850 | name = Release; 851 | }; 852 | 3DE7CFC51B27126F00E0F331 /* Debug */ = { 853 | isa = XCBuildConfiguration; 854 | buildSettings = { 855 | COMBINE_HIDPI_IMAGES = YES; 856 | DEBUG_INFORMATION_FORMAT = dwarf; 857 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 858 | FRAMEWORK_SEARCH_PATHS = ( 859 | "$(DEVELOPER_FRAMEWORKS_DIR)", 860 | "$(inherited)", 861 | ); 862 | GCC_NO_COMMON_BLOCKS = YES; 863 | GCC_PREPROCESSOR_DEFINITIONS = ( 864 | "DEBUG=1", 865 | "$(inherited)", 866 | ); 867 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 868 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 869 | MACOSX_DEPLOYMENT_TARGET = 10.10; 870 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 871 | PRODUCT_NAME = "$(TARGET_NAME)"; 872 | SDKROOT = macosx; 873 | SWIFT_VERSION = 5.0; 874 | }; 875 | name = Debug; 876 | }; 877 | 3DE7CFC61B27126F00E0F331 /* Release */ = { 878 | isa = XCBuildConfiguration; 879 | buildSettings = { 880 | COMBINE_HIDPI_IMAGES = YES; 881 | COPY_PHASE_STRIP = NO; 882 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 883 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 884 | FRAMEWORK_SEARCH_PATHS = ( 885 | "$(DEVELOPER_FRAMEWORKS_DIR)", 886 | "$(inherited)", 887 | ); 888 | GCC_NO_COMMON_BLOCKS = YES; 889 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 890 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 891 | MACOSX_DEPLOYMENT_TARGET = 10.10; 892 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.$(PRODUCT_NAME:rfc1034identifier)"; 893 | PRODUCT_NAME = "$(TARGET_NAME)"; 894 | SDKROOT = macosx; 895 | SWIFT_VERSION = 5.0; 896 | }; 897 | name = Release; 898 | }; 899 | 8015E2171BB9B41400545DF5 /* Debug */ = { 900 | isa = XCBuildConfiguration; 901 | buildSettings = { 902 | APPLICATION_EXTENSION_API_ONLY = YES; 903 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 904 | DEFINES_MODULE = YES; 905 | DYLIB_COMPATIBILITY_VERSION = 1; 906 | DYLIB_CURRENT_VERSION = 1; 907 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 908 | GCC_NO_COMMON_BLOCKS = YES; 909 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 910 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 911 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 912 | PRODUCT_BUNDLE_IDENTIFIER = naoty.Timepiece; 913 | PRODUCT_NAME = Timepiece; 914 | SDKROOT = watchos; 915 | SKIP_INSTALL = YES; 916 | SWIFT_VERSION = 5.0; 917 | TARGETED_DEVICE_FAMILY = 4; 918 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 919 | }; 920 | name = Debug; 921 | }; 922 | 8015E2181BB9B41400545DF5 /* Release */ = { 923 | isa = XCBuildConfiguration; 924 | buildSettings = { 925 | APPLICATION_EXTENSION_API_ONLY = YES; 926 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 927 | COPY_PHASE_STRIP = NO; 928 | DEFINES_MODULE = YES; 929 | DYLIB_COMPATIBILITY_VERSION = 1; 930 | DYLIB_CURRENT_VERSION = 1; 931 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 932 | GCC_NO_COMMON_BLOCKS = YES; 933 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 934 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 935 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 936 | PRODUCT_BUNDLE_IDENTIFIER = naoty.Timepiece; 937 | PRODUCT_NAME = Timepiece; 938 | SDKROOT = watchos; 939 | SKIP_INSTALL = YES; 940 | SWIFT_VERSION = 5.0; 941 | TARGETED_DEVICE_FAMILY = 4; 942 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 943 | }; 944 | name = Release; 945 | }; 946 | 8061C2AB1BB9B62200F0494D /* Debug */ = { 947 | isa = XCBuildConfiguration; 948 | buildSettings = { 949 | APPLICATION_EXTENSION_API_ONLY = YES; 950 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 951 | DEBUG_INFORMATION_FORMAT = dwarf; 952 | DEFINES_MODULE = YES; 953 | DYLIB_COMPATIBILITY_VERSION = 1; 954 | DYLIB_CURRENT_VERSION = 1; 955 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 956 | GCC_NO_COMMON_BLOCKS = YES; 957 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 958 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 959 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 960 | PRODUCT_BUNDLE_IDENTIFIER = naoty.Timepiece; 961 | PRODUCT_NAME = Timepiece; 962 | SDKROOT = appletvos; 963 | SKIP_INSTALL = YES; 964 | SWIFT_VERSION = 5.0; 965 | TARGETED_DEVICE_FAMILY = 3; 966 | TVOS_DEPLOYMENT_TARGET = 9.0; 967 | }; 968 | name = Debug; 969 | }; 970 | 8061C2AC1BB9B62200F0494D /* Release */ = { 971 | isa = XCBuildConfiguration; 972 | buildSettings = { 973 | APPLICATION_EXTENSION_API_ONLY = YES; 974 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 975 | COPY_PHASE_STRIP = NO; 976 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 977 | DEFINES_MODULE = YES; 978 | DYLIB_COMPATIBILITY_VERSION = 1; 979 | DYLIB_CURRENT_VERSION = 1; 980 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 981 | GCC_NO_COMMON_BLOCKS = YES; 982 | INFOPLIST_FILE = "Timepiece.xcodeproj/Timepiece-Info.plist"; 983 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 984 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 985 | PRODUCT_BUNDLE_IDENTIFIER = naoty.Timepiece; 986 | PRODUCT_NAME = Timepiece; 987 | SDKROOT = appletvos; 988 | SKIP_INSTALL = YES; 989 | SWIFT_VERSION = 5.0; 990 | TARGETED_DEVICE_FAMILY = 3; 991 | TVOS_DEPLOYMENT_TARGET = 9.0; 992 | }; 993 | name = Release; 994 | }; 995 | 8061C2AD1BB9B62200F0494D /* Debug */ = { 996 | isa = XCBuildConfiguration; 997 | buildSettings = { 998 | DEBUG_INFORMATION_FORMAT = dwarf; 999 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 1000 | GCC_NO_COMMON_BLOCKS = YES; 1001 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 1002 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1003 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.Timepiece-tvOS-Tests"; 1004 | PRODUCT_NAME = "$(TARGET_NAME)"; 1005 | SDKROOT = appletvos; 1006 | SWIFT_VERSION = 5.0; 1007 | TVOS_DEPLOYMENT_TARGET = 9.0; 1008 | }; 1009 | name = Debug; 1010 | }; 1011 | 8061C2AE1BB9B62200F0494D /* Release */ = { 1012 | isa = XCBuildConfiguration; 1013 | buildSettings = { 1014 | COPY_PHASE_STRIP = NO; 1015 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1016 | EMBED_ASSET_PACKS_IN_PRODUCT_BUNDLE = YES; 1017 | GCC_NO_COMMON_BLOCKS = YES; 1018 | INFOPLIST_FILE = "Timepiece.xcodeproj/TimepieceTests-Info.plist"; 1019 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1020 | PRODUCT_BUNDLE_IDENTIFIER = "naoty.Timepiece-tvOS-Tests"; 1021 | PRODUCT_NAME = "$(TARGET_NAME)"; 1022 | SDKROOT = appletvos; 1023 | SWIFT_VERSION = 5.0; 1024 | TVOS_DEPLOYMENT_TARGET = 9.0; 1025 | }; 1026 | name = Release; 1027 | }; 1028 | /* End XCBuildConfiguration section */ 1029 | 1030 | /* Begin XCConfigurationList section */ 1031 | 3DC61809199E1F8400FB7AAC /* Build configuration list for PBXProject "Timepiece" */ = { 1032 | isa = XCConfigurationList; 1033 | buildConfigurations = ( 1034 | 3DC61820199E1F8400FB7AAC /* Debug */, 1035 | 3DC61821199E1F8400FB7AAC /* Release */, 1036 | ); 1037 | defaultConfigurationIsVisible = 0; 1038 | defaultConfigurationName = Release; 1039 | }; 1040 | 3DC61822199E1F8400FB7AAC /* Build configuration list for PBXNativeTarget "Timepiece iOS" */ = { 1041 | isa = XCConfigurationList; 1042 | buildConfigurations = ( 1043 | 3DC61823199E1F8400FB7AAC /* Debug */, 1044 | 3DC61824199E1F8400FB7AAC /* Release */, 1045 | ); 1046 | defaultConfigurationIsVisible = 0; 1047 | defaultConfigurationName = Release; 1048 | }; 1049 | 3DC61825199E1F8400FB7AAC /* Build configuration list for PBXNativeTarget "Timepiece iOS Tests" */ = { 1050 | isa = XCConfigurationList; 1051 | buildConfigurations = ( 1052 | 3DC61826199E1F8400FB7AAC /* Debug */, 1053 | 3DC61827199E1F8400FB7AAC /* Release */, 1054 | ); 1055 | defaultConfigurationIsVisible = 0; 1056 | defaultConfigurationName = Release; 1057 | }; 1058 | 3DE7CFC71B27126F00E0F331 /* Build configuration list for PBXNativeTarget "Timepiece OSX" */ = { 1059 | isa = XCConfigurationList; 1060 | buildConfigurations = ( 1061 | 3DE7CFC31B27126F00E0F331 /* Debug */, 1062 | 3DE7CFC41B27126F00E0F331 /* Release */, 1063 | ); 1064 | defaultConfigurationIsVisible = 0; 1065 | defaultConfigurationName = Release; 1066 | }; 1067 | 3DE7CFC81B27126F00E0F331 /* Build configuration list for PBXNativeTarget "Timepiece OSX Tests" */ = { 1068 | isa = XCConfigurationList; 1069 | buildConfigurations = ( 1070 | 3DE7CFC51B27126F00E0F331 /* Debug */, 1071 | 3DE7CFC61B27126F00E0F331 /* Release */, 1072 | ); 1073 | defaultConfigurationIsVisible = 0; 1074 | defaultConfigurationName = Release; 1075 | }; 1076 | 8015E2191BB9B41400545DF5 /* Build configuration list for PBXNativeTarget "Timepiece watchOS" */ = { 1077 | isa = XCConfigurationList; 1078 | buildConfigurations = ( 1079 | 8015E2171BB9B41400545DF5 /* Debug */, 1080 | 8015E2181BB9B41400545DF5 /* Release */, 1081 | ); 1082 | defaultConfigurationIsVisible = 0; 1083 | defaultConfigurationName = Release; 1084 | }; 1085 | 8061C2AF1BB9B62200F0494D /* Build configuration list for PBXNativeTarget "Timepiece tvOS" */ = { 1086 | isa = XCConfigurationList; 1087 | buildConfigurations = ( 1088 | 8061C2AB1BB9B62200F0494D /* Debug */, 1089 | 8061C2AC1BB9B62200F0494D /* Release */, 1090 | ); 1091 | defaultConfigurationIsVisible = 0; 1092 | defaultConfigurationName = Release; 1093 | }; 1094 | 8061C2B01BB9B62200F0494D /* Build configuration list for PBXNativeTarget "Timepiece tvOS Tests" */ = { 1095 | isa = XCConfigurationList; 1096 | buildConfigurations = ( 1097 | 8061C2AD1BB9B62200F0494D /* Debug */, 1098 | 8061C2AE1BB9B62200F0494D /* Release */, 1099 | ); 1100 | defaultConfigurationIsVisible = 0; 1101 | defaultConfigurationName = Release; 1102 | }; 1103 | /* End XCConfigurationList section */ 1104 | }; 1105 | rootObject = 3DC61806199E1F8400FB7AAC /* Project object */; 1106 | } 1107 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/xcshareddata/xcschemes/Timepiece OSX.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 | 79 | 85 | 86 | 87 | 88 | 89 | 90 | 96 | 97 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/xcshareddata/xcschemes/Timepiece iOS.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 | 79 | 85 | 86 | 87 | 88 | 89 | 90 | 96 | 97 | 103 | 104 | 105 | 106 | 108 | 109 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/xcshareddata/xcschemes/Timepiece tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Timepiece.xcodeproj/xcshareddata/xcschemes/Timepiece watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 73 | 79 | 80 | 81 | 82 | 84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Timepiece.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | --------------------------------------------------------------------------------