🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

2315閲覧

Swift 数値と文字列の比較時のエラーについて

moriman

総合スコア615

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/04 16:57

非常に基本的なことだと心苦しいのですが、

Swift

1print(3 == "3")

上記のコードを実行すると

ambiguous reference to operator function '=='

というエラーが出るのですが。
翻訳すると「演算子関数「==」へのあいまいな参照」
となるのですが何を意味しているのかつかめません。
これはどういうエラーでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

SwiftではJavascriptみたいに変数の型を動的に変更するような事はできず、違う型の間での比較は原則行えません。明示的に型変換する必要があります。そういう開発思想の言語だからです。

Swiftのコンパイラは、型推論をします。ビルド時に、3"3"といったリテラルの型を、推定して一つに固定します。このために、いちいちIntは1、Floatは1.0などと書き分けなくてもよくなっています。
今回も推定してみたけれど、3や"3"の型を特定できなかったので、ambignousというエラーにしているんだと思います。

余談ですが、==演算子の実体は関数です。3 == "3"と書いたら、3と"3"を引数にとる==関数を探します。"3"はStringかCharactorだろうし、3はIntかFloatかDoubleか、その他いっぱいありますが、どれかに一致する==関数があったらそれにします。複数あったらエラーになるかと思いましたが、実際にはならなくて、どれかが使われます。

関数なので、IntとStringを比較するような==関数を作ることも可能です。可能ですが、やらないほうがいいです。余程上手に設計しないと、想定していない動作をするようなコードになってしまい、保守性や可読性が下がると思います。また、プロトコル指向言語であるSwiftはEquatableというプロトコルを用意していて、それは同じ型のもの同士の比較を前提としています。独自の型についてEquatableに準拠するのは良いアイデアですが、違う型同士の比較をサポートするのはSwift的でないと思います。

投稿2019/12/05 06:55

編集2019/12/05 07:09
eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriman

2019/12/06 05:43

回答を頂きましてありがとうございます。 頂いた情報を元に調べて見ようと思います。
guest

0

print(3 == "3")
ambiguous reference to operator function '=='

たぶんIntとStringが一致しているかを判定する等価演算子が定義されていない、というニュアンスのエラーだと思います。

Swiftは違う型同士の比較はほとんど出来ないので(暗黙的にやってくれるものもあった気がしますが)、文字列なら文字列同士、整数なら整数同士の比較しか出来ないと思ってもらって良いです。

投稿2019/12/05 02:08

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriman

2019/12/06 05:43

回答を頂きましてありがとうございます。 そういう意味合いだったんですね。納得しました。
guest

0

数値と文字列という別個のものを比較しようとしているためのエラーです

千円札と1000と書いてある子供銀行券をもってきてこれは同じものか?とひとに聞いてるようなものです。
どっちも1000と書いてある!と強弁したい気持ちはわからんでもないですが、それではダメです

投稿2019/12/04 17:46

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moriman

2019/12/05 02:15

回答を頂きましてありがとうございます。 なんとなくそうかなあとは思ったのですが、筋としてはエラー内容を見てエラーを解決する方が良いかな、 と思いまして、このエラーの意味を質問してみたのですが、あまり深く踏み込まない方がいいですかね?
y_waiwai

2019/12/05 02:23

エラーメッセージの意味的には何を比較してるのかわからん、ってもんでしょうね まずはエラーメッセージを読んで、それが何を意味するのかを理解するのが最初にすることです 慣れてくると、このメッセージはこの間違いだ、というのが直感的にわかるようになります(場数を踏む、ともいうw) がんばってください
fuzzball

2019/12/05 02:39 編集

エラー内容を見て‥ということなら、ビルドログを見ればもう少し詳しく書かれています。(抜粋) >>Swift.BinaryInteger:2:24: note: candidate requires that 'String' conform to 'BinaryInteger' (requirement specified as 'Other' == 'BinaryInteger') >>Swift.StringProtocol:1:11: note: candidate requires that 'Int' conform to 'StringProtocol' (requirement specified as 'Self' == 'StringProtocol') (追記) と思ったら、普通にエラー表示されてますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問