|
1 | 1 | import Foundation
|
2 | 2 |
|
| 3 | +public enum PlatformVersionCondition { |
| 4 | + case past |
| 5 | + case current |
| 6 | + case future |
| 7 | +} |
| 8 | + |
3 | 9 | public protocol PlatformVersion {
|
4 |
| - var isCurrent: Bool { get } |
| 10 | + var condition: PlatformVersionCondition? { get } |
| 11 | +} |
| 12 | + |
| 13 | +extension PlatformVersion { |
| 14 | + public var isCurrent: Bool { |
| 15 | + condition == .current |
| 16 | + } |
| 17 | + |
| 18 | + public var isCurrentOrPast: Bool { |
| 19 | + condition == .current || condition == .past |
| 20 | + } |
5 | 21 | }
|
6 | 22 |
|
7 | 23 | public struct iOSVersion: PlatformVersion {
|
8 |
| - public let isCurrent: Bool |
| 24 | + public let condition: PlatformVersionCondition? |
9 | 25 |
|
10 |
| - public init(isCurrent: () -> Bool) { |
11 |
| - self.isCurrent = isCurrent() |
| 26 | + public init(condition: () -> PlatformVersionCondition?) { |
| 27 | + self.condition = condition() |
12 | 28 | }
|
13 | 29 | }
|
14 | 30 |
|
15 | 31 | extension iOSVersion {
|
16 | 32 | public static let v13 = iOSVersion {
|
| 33 | + #if os(iOS) |
17 | 34 | if #available(iOS 14, *) {
|
18 |
| - return false |
| 35 | + return .past |
19 | 36 | }
|
20 | 37 | if #available(iOS 13, *) {
|
21 |
| - return true |
| 38 | + return .current |
22 | 39 | }
|
23 |
| - return false |
| 40 | + return .future |
| 41 | + #else |
| 42 | + return nil |
| 43 | + #endif |
24 | 44 | }
|
25 | 45 |
|
26 | 46 | public static let v14 = iOSVersion {
|
| 47 | + #if os(iOS) |
27 | 48 | if #available(iOS 15, *) {
|
28 |
| - return false |
| 49 | + return .past |
29 | 50 | }
|
30 | 51 | if #available(iOS 14, *) {
|
31 |
| - return true |
| 52 | + return .current |
32 | 53 | }
|
33 |
| - return false |
| 54 | + return .future |
| 55 | + #else |
| 56 | + return nil |
| 57 | + #endif |
34 | 58 | }
|
35 | 59 |
|
36 | 60 | public static let v15 = iOSVersion {
|
| 61 | + #if os(iOS) |
37 | 62 | if #available(iOS 16, *) {
|
38 |
| - return false |
| 63 | + return .past |
39 | 64 | }
|
40 | 65 | if #available(iOS 15, *) {
|
41 |
| - return true |
| 66 | + return .current |
42 | 67 | }
|
43 |
| - return false |
| 68 | + return .future |
| 69 | + #else |
| 70 | + return nil |
| 71 | + #endif |
44 | 72 | }
|
45 | 73 |
|
46 | 74 | public static let v16 = iOSVersion {
|
| 75 | + #if os(iOS) |
47 | 76 | if #available(iOS 17, *) {
|
48 |
| - return false |
| 77 | + return .past |
49 | 78 | }
|
50 | 79 | if #available(iOS 16, *) {
|
51 |
| - return true |
| 80 | + return .current |
52 | 81 | }
|
53 |
| - return false |
| 82 | + return .future |
| 83 | + #else |
| 84 | + return nil |
| 85 | + #endif |
54 | 86 | }
|
55 | 87 |
|
56 | 88 | public static let v17 = iOSVersion {
|
| 89 | + #if os(iOS) |
57 | 90 | if #available(iOS 18, *) {
|
58 |
| - return false |
| 91 | + return .past |
59 | 92 | }
|
60 | 93 | if #available(iOS 17, *) {
|
61 |
| - return true |
| 94 | + return .current |
62 | 95 | }
|
63 |
| - return false |
| 96 | + return .future |
| 97 | + #else |
| 98 | + return nil |
| 99 | + #endif |
64 | 100 | }
|
65 | 101 | }
|
66 | 102 |
|
67 | 103 | public struct tvOSVersion: PlatformVersion {
|
68 |
| - public let isCurrent: Bool |
| 104 | + public let condition: PlatformVersionCondition? |
69 | 105 |
|
70 |
| - public init(isCurrent: () -> Bool) { |
71 |
| - self.isCurrent = isCurrent() |
| 106 | + public init(condition: () -> PlatformVersionCondition?) { |
| 107 | + self.condition = condition() |
72 | 108 | }
|
73 | 109 | }
|
74 | 110 |
|
75 | 111 | extension tvOSVersion {
|
76 | 112 | public static let v13 = tvOSVersion {
|
| 113 | + #if os(tvOS) |
77 | 114 | if #available(tvOS 14, *) {
|
78 |
| - return false |
| 115 | + return .past |
79 | 116 | }
|
80 | 117 | if #available(tvOS 13, *) {
|
81 |
| - return true |
| 118 | + return .current |
82 | 119 | }
|
83 |
| - return false |
| 120 | + return .future |
| 121 | + #else |
| 122 | + return nil |
| 123 | + #endif |
84 | 124 | }
|
85 | 125 |
|
86 | 126 | public static let v14 = tvOSVersion {
|
| 127 | + #if os(tvOS) |
87 | 128 | if #available(tvOS 15, *) {
|
88 |
| - return false |
| 129 | + return .past |
89 | 130 | }
|
90 | 131 | if #available(tvOS 14, *) {
|
91 |
| - return true |
| 132 | + return .current |
92 | 133 | }
|
93 |
| - return false |
| 134 | + return .future |
| 135 | + #else |
| 136 | + return nil |
| 137 | + #endif |
94 | 138 | }
|
95 | 139 |
|
96 | 140 | public static let v15 = tvOSVersion {
|
| 141 | + #if os(tvOS) |
97 | 142 | if #available(tvOS 16, *) {
|
98 |
| - return false |
| 143 | + return .past |
99 | 144 | }
|
100 | 145 | if #available(tvOS 15, *) {
|
101 |
| - return true |
| 146 | + return .current |
102 | 147 | }
|
103 |
| - return false |
| 148 | + return .future |
| 149 | + #else |
| 150 | + return nil |
| 151 | + #endif |
104 | 152 | }
|
105 | 153 |
|
106 | 154 | public static let v16 = tvOSVersion {
|
| 155 | + #if os(tvOS) |
107 | 156 | if #available(tvOS 17, *) {
|
108 |
| - return false |
| 157 | + return .past |
109 | 158 | }
|
110 | 159 | if #available(tvOS 16, *) {
|
111 |
| - return true |
| 160 | + return .current |
112 | 161 | }
|
113 |
| - return false |
| 162 | + return .future |
| 163 | + #else |
| 164 | + return nil |
| 165 | + #endif |
114 | 166 | }
|
115 | 167 |
|
116 | 168 | public static let v17 = tvOSVersion {
|
| 169 | + #if os(tvOS) |
117 | 170 | if #available(tvOS 18, *) {
|
118 |
| - return false |
| 171 | + return .past |
119 | 172 | }
|
120 | 173 | if #available(tvOS 17, *) {
|
121 |
| - return true |
| 174 | + return .current |
122 | 175 | }
|
123 |
| - return false |
| 176 | + return .future |
| 177 | + #else |
| 178 | + return nil |
| 179 | + #endif |
124 | 180 | }
|
125 | 181 | }
|
126 | 182 |
|
127 | 183 | public struct macOSVersion: PlatformVersion {
|
128 |
| - public let isCurrent: Bool |
| 184 | + public let condition: PlatformVersionCondition? |
129 | 185 |
|
130 |
| - public init(isCurrent: () -> Bool) { |
131 |
| - self.isCurrent = isCurrent() |
| 186 | + public init(condition: () -> PlatformVersionCondition?) { |
| 187 | + self.condition = condition() |
132 | 188 | }
|
133 | 189 | }
|
134 | 190 |
|
135 | 191 | extension macOSVersion {
|
136 | 192 | public static let v10_15 = macOSVersion {
|
| 193 | + #if os(macOS) |
137 | 194 | if #available(macOS 11, *) {
|
138 |
| - return false |
| 195 | + return .past |
139 | 196 | }
|
140 | 197 | if #available(macOS 10.15, *) {
|
141 |
| - return true |
| 198 | + return .current |
142 | 199 | }
|
143 |
| - return false |
| 200 | + return .future |
| 201 | + #else |
| 202 | + return nil |
| 203 | + #endif |
144 | 204 | }
|
145 | 205 |
|
146 | 206 | public static let v10_15_4 = macOSVersion {
|
| 207 | + #if os(macOS) |
147 | 208 | if #available(macOS 11, *) {
|
148 |
| - return false |
| 209 | + return .past |
149 | 210 | }
|
150 | 211 | if #available(macOS 10.15.4, *) {
|
151 |
| - return true |
| 212 | + return .current |
152 | 213 | }
|
153 |
| - return false |
| 214 | + return .future |
| 215 | + #else |
| 216 | + return nil |
| 217 | + #endif |
154 | 218 | }
|
155 | 219 |
|
156 | 220 | public static let v11 = macOSVersion {
|
| 221 | + #if os(macOS) |
157 | 222 | if #available(macOS 12, *) {
|
158 |
| - return false |
| 223 | + return .past |
159 | 224 | }
|
160 | 225 | if #available(macOS 11, *) {
|
161 |
| - return true |
| 226 | + return .current |
162 | 227 | }
|
163 |
| - return false |
| 228 | + return .future |
| 229 | + #else |
| 230 | + return nil |
| 231 | + #endif |
164 | 232 | }
|
165 | 233 |
|
166 | 234 | public static let v12 = macOSVersion {
|
| 235 | + #if os(macOS) |
167 | 236 | if #available(macOS 13, *) {
|
168 |
| - return false |
| 237 | + return .past |
169 | 238 | }
|
170 | 239 | if #available(macOS 12, *) {
|
171 |
| - return true |
| 240 | + return .current |
172 | 241 | }
|
173 |
| - return false |
| 242 | + return .future |
| 243 | + #else |
| 244 | + return nil |
| 245 | + #endif |
174 | 246 | }
|
175 | 247 |
|
176 | 248 | public static let v13 = macOSVersion {
|
| 249 | + #if os(macOS) |
177 | 250 | if #available(macOS 14, *) {
|
178 |
| - return false |
| 251 | + return .past |
179 | 252 | }
|
180 | 253 | if #available(macOS 13, *) {
|
181 |
| - return true |
| 254 | + return .current |
182 | 255 | }
|
183 |
| - return false |
| 256 | + return .future |
| 257 | + #else |
| 258 | + return nil |
| 259 | + #endif |
184 | 260 | }
|
185 | 261 |
|
186 | 262 | public static let v14 = macOSVersion {
|
| 263 | + #if os(macOS) |
187 | 264 | if #available(macOS 15, *) {
|
188 |
| - return false |
| 265 | + return .past |
189 | 266 | }
|
190 | 267 | if #available(macOS 14, *) {
|
191 |
| - return true |
| 268 | + return .current |
192 | 269 | }
|
193 |
| - return false |
| 270 | + return .future |
| 271 | + #else |
| 272 | + return nil |
| 273 | + #endif |
194 | 274 | }
|
195 | 275 | }
|
0 commit comments