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 一致性的类型实现小于运算符 (<
) 和等于运算符 (==
)。这两个操作对类型的值施加了严格的总顺序,其中对于任何两个值 a
和 b
必须满足以下条件之一:
-
a == b
-
a < b
-
b < a
此外,必须满足以下条件:
-
a < a
始终是false
(非自反性) -
a < b
暗示!(b < a)
(不对称) -
a < b
和b < 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."
请注意,此示例中使用了标准库提供的>
运算符,而不是上面实现的<
运算符。
可用版本
相关用法
- Swift Comparable ...(_:)用法及代码示例
- Swift Comparable ..<(_:)用法及代码示例
- Swift CollectionDifference firstIndex(of:)用法及代码示例
- Swift Collection prefix(upTo:)用法及代码示例
- Swift ContiguousArray forEach(_:)用法及代码示例
- Swift CollectionOfOne contains(_:)用法及代码示例
- Swift Collection first用法及代码示例
- Swift ContiguousArray insert(contentsOf:at:)用法及代码示例
- Swift CollectionOfOne compactMap(_:)用法及代码示例
- Swift CollectionDifference contains(where:)用法及代码示例
- Swift CollectionOfOne last(where:)用法及代码示例
- Swift Collection dropLast(_:)用法及代码示例
- Swift ContiguousArray reserveCapacity(_:)用法及代码示例
- Swift ContiguousArray lexicographicallyPrecedes(_:)用法及代码示例
- Swift ContiguousArray elementsEqual(_:)用法及代码示例
- Swift ContiguousArray isEmpty用法及代码示例
- Swift ContiguousArray suffix(from:)用法及代码示例
- Swift CollectionDifference forEach(_:)用法及代码示例
- Swift CollectionDifference firstIndex(where:)用法及代码示例
- Swift CollectionDifference prefix(_:)用法及代码示例
- Swift CollectionOfOne firstIndex(of:)用法及代码示例
- Swift CollectionDifference randomElement()用法及代码示例
- Swift CollectionDifference endIndex用法及代码示例
- Swift CollectionDifference starts(with:)用法及代码示例
- Swift ContiguousArray endIndex用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 Comparable。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。