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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。