當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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