├── .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 [](https://cocoapods.org/pods/Timepiece) [](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 |
--------------------------------------------------------------------------------