@@ -186,22 +186,24 @@ extension Version: Comparable, Hashable {
186186 return true // Prerelease lhs < non-prerelease rhs
187187 }
188188
189- let zippedIdentifiers = zip ( lhs. prereleaseIdentifiers, rhs. prereleaseIdentifiers)
190- for (lhsPrereleaseIdentifier, rhsPrereleaseIdentifier) in zippedIdentifiers {
189+ for (lhsPrereleaseIdentifier, rhsPrereleaseIdentifier) in zip ( lhs. prereleaseIdentifiers, rhs. prereleaseIdentifiers) {
191190 if lhsPrereleaseIdentifier == rhsPrereleaseIdentifier {
192191 continue
193192 }
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
205207 }
206208 }
207209
0 commit comments