@@ -186,22 +186,24 @@ extension Version: Comparable, Hashable {
186
186
return true // Prerelease lhs < non-prerelease rhs
187
187
}
188
188
189
- let zippedIdentifiers = zip ( lhs. prereleaseIdentifiers, rhs. prereleaseIdentifiers)
190
- for (lhsPrereleaseIdentifier, rhsPrereleaseIdentifier) in zippedIdentifiers {
189
+ for (lhsPrereleaseIdentifier, rhsPrereleaseIdentifier) in zip ( lhs. prereleaseIdentifiers, rhs. prereleaseIdentifiers) {
191
190
if lhsPrereleaseIdentifier == rhsPrereleaseIdentifier {
192
191
continue
193
192
}
194
-
195
- let typedLhsIdentifier : Any = Int ( lhsPrereleaseIdentifier) ?? lhsPrereleaseIdentifier
196
- let typedRhsIdentifier : Any = Int ( rhsPrereleaseIdentifier) ?? rhsPrereleaseIdentifier
197
-
198
- switch ( typedLhsIdentifier, typedRhsIdentifier) {
199
- case let ( int1 as Int , int2 as Int ) : return int1 < int2
200
- case let ( string1 as String , string2 as String ) : return string1 < string2
201
- case ( is Int , is String ) : return true // Int prereleases < String prereleases
202
- case ( is String , is Int ) : return false
203
- default :
204
- return false
193
+
194
+ // Check if either of the 2 pre-release identifiers is numeric.
195
+ let lhsNumericPrereleaseIdentifier = Int ( lhsPrereleaseIdentifier)
196
+ let rhsNumericPrereleaseIdentifier = Int ( rhsPrereleaseIdentifier)
197
+
198
+ if let lhsNumericPrereleaseIdentifier = lhsNumericPrereleaseIdentifier,
199
+ let rhsNumericPrereleaseIdentifier = rhsNumericPrereleaseIdentifier {
200
+ return lhsNumericPrereleaseIdentifier < rhsNumericPrereleaseIdentifier
201
+ } else if lhsNumericPrereleaseIdentifier != nil {
202
+ return true // numeric pre-release < non-numeric pre-release
203
+ } else if rhsNumericPrereleaseIdentifier != nil {
204
+ return false // non-numeric pre-release > numeric pre-release
205
+ } else {
206
+ return lhsPrereleaseIdentifier < rhsPrereleaseIdentifier
205
207
}
206
208
}
207
209
0 commit comments