teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

==が演算子でない、という間違いを訂正。Equatableプロトコルについて追記。

2019/12/05 07:09

投稿

eytyet
eytyet

スコア803

answer CHANGED
@@ -3,6 +3,6 @@
3
3
  Swiftのコンパイラは、型推論をします。ビルド時に、`3`や`"3"`といったリテラルの型を、推定して一つに固定します。このために、いちいちIntは1、Floatは1.0などと書き分けなくてもよくなっています。
4
4
  今回も推定してみたけれど、`3`や"3"の型を特定できなかったので、ambignousというエラーにしているんだと思います。
5
5
 
6
- 余談ですが、`==`演算子じゃなくて、関数です。`3 == "3"`と書いたら、3と"3"を引数にとる`==`関数を探します。"3"はStringかCharactorだろうし、3はIntかFloatかDoubleか、その他いっぱいありますが、どれかに一致する`==`関数があったらそれにします。複数あったらエラーになるかと思いましたが、実際にはならなくて、どれかが使われます。
6
+ 余談ですが、`==`演算子の実体は関数です。`3 == "3"`と書いたら、3と"3"を引数にとる`==`関数を探します。"3"はStringかCharactorだろうし、3はIntかFloatかDoubleか、その他いっぱいありますが、どれかに一致する`==`関数があったらそれにします。複数あったらエラーになるかと思いましたが、実際にはならなくて、どれかが使われます。
7
7
 
8
- 関数なので、IntとStringを比較するような`==`関数を作ることも可能です。可能ですが、やらないほうがいいです。余程上手に設計しないと、想定していない動作をするようなコードになってしまい、保守性や可読性が下がると思います。
8
+ 関数なので、IntとStringを比較するような`==`関数を作ることも可能です。可能ですが、やらないほうがいいです。余程上手に設計しないと、想定していない動作をするようなコードになってしまい、保守性や可読性が下がると思います。また、プロトコル指向言語であるSwiftはEquatableというプロトコルを用意していて、それは同じ型のもの同士の比較を前提としています。独自の型についてEquatableに準拠するのは良いアイデアですが、違う型同士の比較をサポートするのは**Swift的でない**と思います。