文書   >   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 つの演算子は、型の値に厳密な合計順序を課します。この場合、a と b の 2 つの値に対して、以下のいずれか 1 つが true でなければなりません。
- 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 }
Date に Comparable への準拠を追加するには、まず 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 インスタンスは、それぞれの対応するプロパティが等しい場合、等しいです。
Date が Comparable に準拠しているので、型のインスタンスを任意の関係演算子で比較できます。以下の例では、最初の月の着陸日と 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 要件
static func < (Self, Self) -> Bool
最初の引数の値が 2 番目の引数の値よりも小さいかどうかを示すブール値を返します。
必須。 デフォルトの実装が提供されます。
static func <= (Self, Self) -> Bool
最初の引数の値が 2 番目の引数の値以下かどうかを示すブール値を返します。
必須。 デフォルトの実装が提供されます。
  Beta  
static func > (Self, Self) -> Bool
最初の引数の値が 2 番目の引数の値よりも大きいかどうかを示すブール値を返します。
必須。 デフォルトの実装が提供されます。
  Beta  
static func >= (Self, Self) -> Bool
最初の引数の値が 2 番目の引数の値以上かどうかを示すブール値を返します。
必須。 デフォルトの実装が提供されます。
  Beta  
範囲式
static func ..< (Self, Self) -> Range<Self>
その下限を含み、上限を含まない半開放範囲を返します。
static func ... (Self, Self) -> ClosedRange<Self>
両方の境界を含む閉鎖範囲を返します。
static func ... (Self) -> PartialRangeFrom<Self>
下限から上に延びる部分範囲を返します。
  Beta  
static func ... (Self) -> PartialRangeThrough<Self>
上限を含む上への部分範囲を返します。
  Beta  
static func ..< (Self) -> PartialRangeUpTo<Self>
その上限を含まない、上への部分範囲を返します。
タプルの比較
これらの比較演算子を使用して、2 つから 6 つの Comparable 要素のタプルを比較します。
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
func < <A, B>((A, B), (A, B)) -> Bool
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
func < <A, B, C>((A, B, C), (A, B, C)) -> Bool
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
func < <A, B, C, D>((A, B, C, D), (A, B, C, D)) -> Bool
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
func < <A, B, C, D, E>((A, B, C, D, E), (A, B, C, D, E)) -> Bool
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
func < <A, B, C, D, E, F>((A, B, C, D, E, F), (A, B, C, D, E, F)) -> Bool
第 1 のタプルが第 2 のタプルの前に辞書の順で順序付けられているかどうかを示すブール値を返します。
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func <= <A, B>((A, B), (A, B)) -> Bool
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func <= <A, B, C>((A, B, C), (A, B, C)) -> Bool
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func <= <A, B, C, D>((A, B, C, D), (A, B, C, D)) -> Bool
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func <= <A, B, C, D, E>((A, B, C, D, E), (A, B, C, D, E)) -> Bool
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func <= <A, B, C, D, E, F>((A, B, C, D, E, F), (A, B, C, D, E, F)) -> Bool
第 1 のタプルが第 2 のタプルの前か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
func > <A, B>((A, B), (A, B)) -> Bool
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
func > <A, B, C>((A, B, C), (A, B, C)) -> Bool
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
func > <A, B, C, D>((A, B, C, D), (A, B, C, D)) -> Bool
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
func > <A, B, C, D, E>((A, B, C, D, E), (A, B, C, D, E)) -> Bool
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
func > <A, B, C, D, E, F>((A, B, C, D, E, F), (A, B, C, D, E, F)) -> Bool
第 1 のタプルが第 2 のタプルの後に辞書の順で順序付けられているかどうかを示すブール値を返します。
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func >= <A, B>((A, B), (A, B)) -> Bool
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func >= <A, B, C>((A, B, C), (A, B, C)) -> Bool
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func >= <A, B, C, D>((A, B, C, D), (A, B, C, D)) -> Bool
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func >= <A, B, C, D, E>((A, B, C, D, E), (A, B, C, D, E)) -> Bool
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
func >= <A, B, C, D, E, F>((A, B, C, D, E, F), (A, B, C, D, E, F)) -> Bool
第 1 のタプルが第 2 のタプルの後か同じに辞書の順で順序付けられているかどうかを示すブール値を返します。
関連
以下からの継承
以下による継承
以下により採用
- AnyIndex
- Character
- Character.UnicodeScalarView.Index
- ClosedRange.Index
- CMTime
- Date
- DateInterval
- Decimal
- Dictionary.Index
- DispatchTime
- DispatchWallTime
- FlattenCollection.Index
- IndexPath
- IndexSet.Index
- LazyDropWhileCollection.Index
- LazyPrefixWhileCollection.Index
- Measurement
- MLDataValue.DictionaryType.Index
- ObjectIdentifier
- OSSignpostID
- ReversedCollection.Index
- Set.Index
- String
- String.Index
- Unicode.Scalar
- UnsafeMutablePointer
- UnsafeMutableRawPointer
- UnsafePointer
- UnsafeRawPointer
等しさと順序づけ
値が等しいかどうかを比較できる型。
この文書には、開発中の API または技術に関する予備情報が含まれています。この情報は変更されることがあり、この文書に従って実装されたソフトウェアは、最終的なオペレーティングシステムソフトウェアでテストする必要があります。
Apple のベータ版ソフトウェアの使用方法の詳細について学ぶ: