非常に基本的なことだと心苦しいのですが、
Swift
1print(3 == "3")
上記のコードを実行すると
ambiguous reference to operator function '=='
というエラーが出るのですが。
翻訳すると「演算子関数「==」へのあいまいな参照」
となるのですが何を意味しているのかつかめません。
これはどういうエラーでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア803
0
print(3 == "3")
ambiguous reference to operator function '=='
たぶんIntとStringが一致しているかを判定する等価演算子が定義されていない、というニュアンスのエラーだと思います。
Swiftは違う型同士の比較はほとんど出来ないので(暗黙的にやってくれるものもあった気がしますが)、文字列なら文字列同士、整数なら整数同士の比較しか出来ないと思ってもらって良いです。
投稿2019/12/05 02:08
総合スコア8356
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
数値と文字列という別個のものを比較しようとしているためのエラーです
千円札と1000と書いてある子供銀行券をもってきてこれは同じものか?とひとに聞いてるようなものです。
どっちも1000と書いてある!と強弁したい気持ちはわからんでもないですが、それではダメです
投稿2019/12/04 17:46
総合スコア88038
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/05 02:15
2019/12/05 02:23
2019/12/05 02:39 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/06 05:43