2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Swift】値を比較するためのプロトコル

Last updated at Posted at 2020-12-02

プロトコル とは

プロトコルとは、それに準拠する型が持つべき機能や性質を定義したものになります。

プロトコルに準拠する型は、
プロトコルに定義されているメソッドやプロパティを実装しなければなりません。

プロトコルを用いることにより、
異なる型に対して同じ性質を与えることができます。

つまり、値の比較をするためのプロトコルに準拠している全ての型が
値を比較する機能を使うことができるのです。

その、値を比較するプロトコルというのが、
Equatableプロトコルと、Comparableプロトコルになります。

これらのプロトコルはInt型やString型が準拠しておりその機能を使うことができます。

Equatableプロトコル

Equatableプロトコルは同値性を検証するためのプロトコルになります。

このプロトコルに準拠している同じ型どうしは、
==演算子で値の一致を、!=演算子で値の不一致を確認することができます。

基本的な型の多くはこのプロトコルに準拠しております。
例えば、よく利用される、
Int型、String型、Double型、Float型、Bool型などはEquatableプロトコルに準拠しています。


let boolLeft = true
let boolRight = false
boolLeft == boolRight   // false
boolLeft != boolRight   // true

let intLeft = 1
let intRight = 2
intLeft == intRight   // false
intLeft != intRight   // true

let stringLeft = "abc"
let stringRight = "def"
stringLeft == stringRight   // false
stringLeft != stringRight   // true

一方で、Equatableプロトコルに準拠していないAny型などは、
値の一致、不一致を確認することができずコンパイルエラーになります。


let anyLeft = "abc" as Any
let anyRight = "def" as Any
anyLeft == anyRight   // コンパイルエラー
anyLeft != anyRight   // コンパイルエラー

また、Optional<Wrapped>型に関しても、
Wrapped型がEquatableプロトコルに準拠している時のみ、
Optional<Wrapped>型もEquatableプロトコルに準拠しているとみなされます。

今回の例はOptional<String>型の例になります。


let optionalLeft: String? = "abc"   // Optional("abc")
let optionalRight: String? = "def"   // Optional("def")
optionalLeft == optionalRight   // false
optionalLeft != optionalRight   // true

Comparableプロトコル

Comparableプロトコルは値の大小関係を確認するプロトコルです。

Comparableプロトコルに準拠している型は、
4つの比較演算子によって値の大小を比較することができます。

また、Equatableプロトコルと同じで、
多くの基本的な型がComparableプロトコルに準拠していますが、
Any型とBool型、Optional<Wrapped>型はComparableプロトコルに準拠しておりません。

比較演算子については別の記事でまとめたのでそちらをご覧ください。


let intLeft = 1
let intRight = 2
intLeft < intRight   // true

let floatLeft: Float = 1.0
let floatRight: Float = 2.2
floatLeft < floatRight   // true

let stringLeft = "abc"
let stringRight = "def"
stringLeft < stringRight   // true

実は、String型にも大小関係存在します。
String型の場合は若い値の方が小さい値という認識らしいです。

アルファベット順で行くと
a, b, c, d, e, f, g ・・・ なので
文字列abc より 文字列defの方が値が大きいという認識になります。

文字列の比較はまだしたことがないのであっているか分かりませんが、
50音順に並べる時などは使えそうですかね?

使う機会が会ったらメモがてら共有できたらと思います。

以上、ご覧いただきありがとうございました。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?