当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Swift Comparable用法及代码示例


协议

Comparable

可以使用关系运算符 <<=>=> 比较的类型。

声明

protocol Comparable : Equatable

概述

Comparable 协议用于具有固有顺序的类型,例如数字和字符串。标准库中的许多类型已经符合Comparable 协议。当您希望能够使用关系运算符比较实例或使用为 Comparable 类型设计的标准库方法时,将 Comparable 一致性添加到您自己的自定义类型。

关系运算符最常见的用法是比较数字,如下例所示:


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!"

使用Comparable 类型时,您可以使用某些序列和集合操作的特殊版本。例如,如果您的数组元素符合 Comparable ,您可以调用 sort() 方法而不使用参数来按升序对数组元素进行排序。


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]"

符合可比协议

具有 Comparable 一致性的类型实现小于运算符 (<) 和等于运算符 (==)。这两个操作对类型的值施加了严格的总顺序,其中对于任何两个值 ab 必须满足以下条件之一:

  • a == b

  • a < b

  • b < a

此外,必须满足以下条件:

  • a < a 始终是 false(非自反性)

  • a < b 暗示 !(b < a)(不对称)

  • a < bb < c 意味着 a < c(传递性)

要将Comparable 一致性添加到您的自定义类型,请将<== 运算符定义为您的类型的静态方法。 == 运算符是Equatable 协议的要求,Comparable 扩展了该协议——有关 Swift 中相等性的更多信息,请参阅该协议的文档。由于标准库提供了其余关系运算符的默认实现,因此您无需任何其他代码即可将 !=><=>= 与您的类型的实例一起使用。

例如,下面是一个 Date 结构的实现,它存储日期的年、月和日:


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

要将 Comparable 一致性添加到 Date ,首先声明与 Comparable 的一致性并实现 < 运算符函数。


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
        }
    }

此函数使用日期的最不特定的不匹配属性来确定比较结果。例如,如果两个 year 属性相等但两个 month 属性不相等,则 month 值较小的日期是两个日期中较小的日期。

接下来,实现== 运算符函数,该要求继承自Equatable 协议。


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

如果两个 Date 实例的每个对应属性相等,则它们是相等的。

现在 Date 符合 Comparable ,您可以将该类型的实例与任何关系运算符进行比较。下面的例子比较了第一次登月的日期和大卫鲍伊的歌曲“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."

请注意,此示例中使用了标准库提供的> 运算符,而不是上面实现的< 运算符。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相关用法


注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Comparable。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。