<!--
{
  "availability" : [
    "iOS: 8.0.0 -",
    "iPadOS: 8.0.0 -",
    "macCatalyst: 13.0.0 -",
    "macOS: 10.10.0 -",
    "tvOS: 9.0.0 -",
    "visionOS: 1.0.0 -",
    "watchOS: 2.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "Swift",
  "identifier" : "/documentation/Swift/Comparable",
  "metadataVersion" : "0.1.0",
  "role" : "Protocol",
  "symbol" : {
    "kind" : "Protocol",
    "modules" : [
      "Swift"
    ],
    "preciseIdentifier" : "s:SL"
  },
  "title" : "Comparable"
}
-->

# Comparable

A type that can be compared using the relational operators `<`, `<=`, `>=`,
and `>`.

```
protocol Comparable : Equatable, ~Copyable, ~Escapable
```

## Overview

The `Comparable` protocol is used for types that have an inherent order,
such as numbers and strings. Many types in the standard library already
conform to the `Comparable` protocol. Add `Comparable` conformance to your
own custom types when you want to be able to compare instances using
relational operators or use standard library methods that are designed for
`Comparable` types.

The most familiar use of relational operators is to compare numbers, as in
the following example:

```
let currentTemp = 73

if currentTemp >= 90 {
    print("It's a scorcher!")
} else if currentTemp < 65 {
    print("Might need a sweater today.")
} else {
    print("Seems like picnic weather!")
}
// Prints "Seems like picnic weather!"
```

You can use special versions of some sequence and collection operations
when working with a `Comparable` type. For example, if your array’s
elements conform to `Comparable`, you can call the `sort()` method without
using arguments to sort the elements of your array in ascending order.

```
var measurements = [1.1, 1.5, 2.9, 1.2, 1.5, 1.3, 1.2]
measurements.sort()
print(measurements)
// Prints "[1.1, 1.2, 1.2, 1.3, 1.5, 1.5, 2.9]"
```

# Conforming to the Comparable Protocol

Types with Comparable conformance implement the less-than operator (`<`)
and the equal-to operator (`==`). These two operations impose a strict
total order on the values of a type, in which exactly one of the following
must be true for any two values `a` and `b`:

- `a == b`
- `a < b`
- `b < a`

In addition, the following conditions must hold:

- `a < a` is always `false` (Irreflexivity)
- `a < b` implies `!(b < a)` (Asymmetry)
- `a < b` and `b < c` implies `a < c` (Transitivity)

To add `Comparable` conformance to your custom types, define the `<` and
`==` operators as static methods of your types. The `==` operator is a
requirement of the `Equatable` protocol, which `Comparable` extends—see
that protocol’s documentation for more information about equality in
Swift. Because default implementations of the remainder of the relational
operators are provided by the standard library, you’ll be able to use
`!=`, `>`, `<=`, and `>=` with instances of your type without any further
code.

As an example, here’s an implementation of a `Date` structure that stores
the year, month, and day of a date:

```
struct Date {
    let year: Int
    let month: Int
    let day: Int
}
```

To add `Comparable` conformance to `Date`, first declare conformance to
`Comparable` and implement the `<` operator function.

```
extension Date: Comparable {
    static func < (lhs: Date, rhs: Date) -> Bool {
        if lhs.year != rhs.year {
            return lhs.year < rhs.year
        } else if lhs.month != rhs.month {
            return lhs.month < rhs.month
        } else {
            return lhs.day < rhs.day
        }
    }
```

This function uses the least specific nonmatching property of the date to
determine the result of the comparison. For example, if the two `year`
properties are equal but the two `month` properties are not, the date with
the lesser value for `month` is the lesser of the two dates.

Next, implement the `==` operator function, the requirement inherited from
the `Equatable` protocol.

```
    static func == (lhs: Date, rhs: Date) -> Bool {
        return lhs.year == rhs.year && lhs.month == rhs.month
            && lhs.day == rhs.day
    }
}
```

Two `Date` instances are equal if each of their corresponding properties is
equal.

Now that `Date` conforms to `Comparable`, you can compare instances of the
type with any of the relational operators. The following example compares
the date of the first moon landing with the release of David Bowie’s song
“Space Oddity”:

```
let spaceOddity = Date(year: 1969, month: 7, day: 11)   // July 11, 1969
let moonLanding = Date(year: 1969, month: 7, day: 20)   // July 20, 1969
if moonLanding > spaceOddity {
    print("Major Tom stepped through the door first.")
} else {
    print("David Bowie was following in Neil Armstrong's footsteps.")
}
// Prints "Major Tom stepped through the door first."
```

Note that the `>` operator provided by the standard library is used in this
example, not the `<` operator implemented above.

> Note: A conforming type may contain a subset of values which are treated
> as exceptional—that is, values that are outside the domain of
> meaningful arguments for the purposes of the `Comparable` protocol. For
> example, the special “not a number” value for floating-point types
> (`FloatingPoint.nan`) compares as neither less than, greater than, nor
> equal to any normal floating-point value. Exceptional values need not
> take part in the strict total order.

## Topics

### Comparable Requirements

### Range Expressions

[`...(_:_:)`](/documentation/Swift/Comparable/...(_:_:))

Returns a closed range that contains both of its bounds.

[`...(_:)`](/documentation/Swift/Comparable/...(_:)-6mvrh)

Returns a partial range extending upward from a lower bound.

[`...(_:)`](/documentation/Swift/Comparable/...(_:)-1quco)

Returns a partial range up to, and including, its upper bound.

### Tuple Comparison

Compare tuples of between two and six `Comparable` elements using these comparative
operators.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-1b1cu)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-4ck5h)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-23151)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-6p1tf)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-3hhjy)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<(_:_:)`](/documentation/Swift/_(_:_:)-8mgtp)

Returns a Boolean value indicating whether the first tuple is ordered
before the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-16p1e)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-3jpod)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-8u5uu)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-6kea2)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-1hzxz)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`<=(_:_:)`](/documentation/Swift/_=(_:_:)-7n746)

Returns a Boolean value indicating whether the first tuple is ordered
before or the same as the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-yktb)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-4xg09)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-7p512)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-5gb41)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-3ewuy)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>(_:_:)`](/documentation/Swift/_(_:_:)-kqsy)

Returns a Boolean value indicating whether the first tuple is ordered
after the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-1ak1k)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-6kwvw)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-7p28b)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-43xgn)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-6i1ov)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.

[`>=(_:_:)`](/documentation/Swift/_=(_:_:)-1n7oc)

Returns a Boolean value indicating whether the first tuple is ordered
after or the same as the second in a lexicographical ordering.



---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)