文書   >   Swift   >   Swift 標準ライブラリ   >   Basic Behaviors   >   Comparable


プロトコル


Comparable


関係演算子 <、<=、>=、および > を使用して比較できる型。





概要


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 プロトコルへの準拠


Comparable 準拠の型は、小なり演算子(<) および等価演算子 (==) を実装します。これらの 2 つの演算子は、型の値に厳密な合計順序を課します。この場合、ab の 2 つの値に対して、以下のいずれか 1 つが true でなければなりません。


さらに、以下の条件が満たされていなければなりません。


カスタム型に Comparable への準拠を追加するには、< および == 演算子を型の静的メソッドとして定義します。== 演算子は Equatable プロトコルの要件であり、Comparable はこれを拡張しています。Swift の同等性の詳細については、そのプロトコルの文書を参照してください。残りの関係演算子のデフォルトの実装は標準ライブラリによって提供されるため、あなたの型のインスタンスでは、余分なコードを一切使わずに !=><=>= を使用することができます。


たとえば、日付の年、月、日を格納する Date 構造体の実装を以下に示します。


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


DateComparable への準拠を追加するには、まず 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
        }
    }


この関数は、日付の最小の不一致プロパティを使用して、比較結果を判定します。たとえば、2 つの year のプロパティが等しいが、2 つのmonth のプロパティが同じでない場合、month の値が小さい日付は、2 つの日付のうち小さい方です。


次に、equatable プロトコルから継承した要件である == 演算子関数を実装します。


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


2 つの Date インスタンスは、それぞれの対応するプロパティが等しい場合、等しいです。


DateComparable に準拠しているので、型のインスタンスを任意の関係演算子で比較できます。以下の例では、最初の月の着陸日と David Bowie の曲 "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."


この例では、標準ライブラリで提供されている > 演算子が使用されていますが、上記の < 演算子は実装されていません。


注意:

準拠型には、例外として扱われる値のサブセット、つまり例外とは Comparable プロトコルの目的で意味のある引数のドメイン外にある値の事ですが、それを含めることができます。たとえば、浮動小数点型 (FloatingPoint.nan) の特殊な "数値ではない (not a number)" 値は、通常の浮動小数点値より小さいか、より大きいか、等しくないかとしては比較されません。例外的な値は厳密な合計順序に参加する必要はありません。


トピックス





Comparable 要件





範囲式





タプルの比較


関連





以下からの継承


Equatable





以下による継承





以下により採用


  • AnyIndex
  • Character
  • Character.UnicodeScalarView
    .Index
  • ClosedRange.Index
  • CMTime
  • Date
  • DateInterval
  • Decimal
  • Dictionary.Index
  • DispatchTime
  • DispatchWallTime
  • FlattenCollection.Index
  • IndexPath
  • IndexSet.Index
  • LazyDropWhileCollection.Index

等しさと順序づけ


ベータソフトウェア

この文書には、開発中の API または技術に関する予備情報が含まれています。この情報は変更されることがあり、この文書に従って実装されたソフトウェアは、最終的なオペレーティングシステムソフトウェアでテストする必要があります。

Apple のベータ版ソフトウェアの使用方法の詳細について学ぶ:





目次
Xcode 10 の新機能

  • SDK
  • Xcode 7.0+
  • フレームワーク
  • Swift 標準ライブラリ
  • 概要
  • トピックス
  • 関連
  • 以下も見よ












  • トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)












    トップへ(Swift 標準ライブラリ)