-
Notifications
You must be signed in to change notification settings - Fork 150
/
Copy pathDouble+Measures.swift
157 lines (134 loc) · 5.18 KB
/
Double+Measures.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//
// Double+Meatures.swift
// OpenGpxTracker
//
// Created by merlos on 03/05/2019.
//
// Shared file: this file is also included in the OpenGpxTracker-Watch Extension target.
import Foundation
/// Number of meters in 1 mile (mi)
let kMetersPerMile = 1609.344
/// Number of meters in 1 kilometer (km)
let kMetersPerKilometer = 1000.0
/// Number of meters in 1 feet (ft)
let kMetersPerFeet = 0.3048
/// Number of kilometers per hour in 1 meter per second
/// To convert m/s -> km/h
let kKilometersPerHourInOneMeterPerSecond = 3.6
/// Number of miles per hour in 1 meter per second
/// To convert m/s -> mph
let kMilesPerHourInOneMeterPerSecond = 2.237
/// Number of miles per hour in 1 meter per second
///
/// Extension to convert meters to other units
///
/// It was created to support conversion of units also in iOS9
///
/// (UnitConverterLinear)[https://developer.apple.com/documentation/foundation/unitlength#overview]
/// is available only in iOS 10 or above.
///
/// It always asumes the value in meters (lengths) or meters per second (speeds)
extension Double {
/// Assuming current value is in meters, it returns the equivalent in feet
func toFeet() -> Double {
return self/kMetersPerFeet
}
/// Assuming current value is in meters, it returns the equivalent string in feet without decimals and with "ft"
func toFeet() -> String {
return String(format: "%.0fft", self.toFeet() as Double)
}
/// Assuming current value is in meters, it returns the equivalent in miles
func toMiles() -> Double {
return self/kMetersPerMile
}
/// Assuming current value is in meters, it returns the equivalent string
/// in miles with two decimals and "mi"
///
/// - Example:
///
/// Double d = 1609.344
/// d.toMilesString() => "1.00mi"
///
func toMiles() -> String {
return String(format: "%.2fmi", toMiles() as Double)
}
/// Assuming current value is in meters, it returns the equivalent in kilometers
func toKilometers() -> Double {
return self/kMetersPerKilometer
}
/// Assuming current value is in meters, it returns a string wiht the equivalent in
/// kilometers with two decimals and km
///
/// Example: Current value is 1210.0, it returns "1.21km"
func toKilometers() -> String {
return String(format: "%.2fkm", toKilometers() as Double)
}
/// Returns current value as a string without decimals and with m.
///
/// Example: Current value is 1210.13, it returns "1210m"
func toMeters() -> String {
return String(format: "%.0fm", self)
}
/// Assuming current value (d) is in meters it returns the distance as string
/// * if d < 1000 => in meters ("567m")
/// * if d > 1000 => in kilometers ("1.24km")
/// * if useImperial == true => converted in miles ("1.24mi")
func toDistance(useImperial: Bool = false) -> String {
if useImperial {
return toMiles() as String
} else {
return self > kMetersPerKilometer ? toKilometers() as String : toMeters() as String
}
}
/// Assuming current value is a speed in meters per second (m/s),
///
/// - Returns:
/// The speed in miles per hour (mph)
func toMilesPerHour() -> Double {
return self * kMilesPerHourInOneMeterPerSecond
}
/// Assuming current value is a speed in meters per second (m/s),
///
/// - Returns:
/// The speed in miles per hour (mph) with two decimals as
/// string ("120.34mph")
func toMilesPerHour() -> String {
return String(format: "%.2fmph", toMilesPerHour() as Double)
}
/// Assuming current value is a speed in meters per second (m/s),
///
/// - Returns:
/// The speed in kilometers per hour (km/h)
func toKilometersPerHour() -> Double {
return self * kKilometersPerHourInOneMeterPerSecond
}
/// Assuming current value is a speed in meters per second (m/s),
///
/// - Returns:
/// The speed in kilometers per hour with two decimals as
/// string ("120.34km/h")
func toKilometersPerHour() -> String {
return String(format: "%.2fkm/h", toKilometersPerHour() as Double)
}
/// Assuming current value is a speed in meters per second (m/s),
///
/// - Returns:
/// The speed in km/h (100.00km/h) or mph (60.00mph) if `useImperial` is set to `true`.
func toSpeed(useImperial: Bool = false) -> String {
return useImperial ? toMilesPerHour() : toKilometersPerHour() as String
}
/// Asuming current value is an altitud in meters,
///
/// - Returns:
/// The altitude in m ("100m") or in feet (304ft) if `useImperial` is set to `true`.
func toAltitude(useImperial: Bool = false) -> String {
return useImperial ? toFeet() : toMeters() as String
}
/// Asuming current value is an altitud in meters,
///
/// - Returns:
/// The altitude in m ("±100m") or in feet (±304ft) if `useImperial` is set to `true`.
func toAccuracy(useImperial: Bool = false) -> String {
return "±\(useImperial ? toFeet() as String : toMeters() as String)"
}
}