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

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

詳細はこちら
Swift

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

Q&A

解決済

1回答

373閲覧

Swift ジェネリック関数と演算子のオーバーロードについて

moriman

総合スコア615

Swift

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

0グッド

0クリップ

投稿2019/11/18 04:38

よくあるジェネリック関数の基本的なサンプル

Swift

1func add<T>(_ num1: T, _ num2: T) -> T { 2 return num1 + num2 3} 4 5print(add(3,5))

で、なぜエラーが出るのか、など考えています。

add関数実行では引数にInt型を渡しているので、これで動きそうな気がするんですが、
結局引数の型はT型、なのでT型が+演算子が使える型であることを保証する
必要がある。ということでしょうか。

「T型が+演算子が使える型であることを保証する」というのは演算子のオーバーロードの話だと思うのですが。
https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html
上記ページを読んで、結局ある型(たとえばVector2D型)で+演算子を使いたいのなら、Vector2D型のstaticメソッドとして演算子メソッドを(extensionを使うなどして)定義する必要がある、ということだと思います。

そこで次のサンプル
https://stackoverflow.com/questions/34125637/binary-operator-cannot-be-applied-to-two-t-operands

Swift

1protocol Addable { 2 static func +(lhs: Self, rhs: Self) -> Self 3} 4 5func add<T: Addable>(_ num1: T, _ num2: T) -> T { 6 return num1 + num2 7} 8 9extension Int: Addable {} 10extension Double: Addable {} 11extension Float: Addable {} 12 13print(add(3, 1.5)) //結果:4.5

Addableプロトコル内で(+の)演算子メソッドを記述しているんですが、プロトコルの定義内なので引数と戻り値の型のみを宣言している。
その後、Int型・Double型・Float型がAddableプロトコルに準拠する記述をextensionを使って書いていると思うのですが、厳密には(基本のみ学習した私の現時点での知識をもとに考えると)例えばInt型の場合

Swift

1extension Int: Addable { 2 static func +(lhs: Self, rhs: Self) -> Self{ 3 //実装 4 } 5}

という感じで演算子メソッドの実装を記述する必要があると思うのですが、それ無しでエラーが出ずに動いてます。なぜ演算子メソッドの中身の実装無しでエラーが出ないのでしょうか?

これって
https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html
の==演算子の部分に書かれているsynthesized implementationが+演算子にも当てはまる、みたいな話でしょうか?別の話でしょうか?

できれば公式ドキュメント的なものでどこに説明があるのかも教えていただけるとありがたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

単純に protocol に必要なプロパティやメソッドをすでに持っている場合は、重ねて定義する必要がないだけです。
Int, Double, Floatにはすでに + 演算子があるので大丈夫ということです。

ちなみにSwift5から足し算が出来ることを保証するAdditiveArithmeticプロトコルが出来ましたので、Addable プロトコルを作る必要はないです。
AdditiveArithmeticプロトコルは加法群なのでちょっと違いますけど。

投稿2019/11/18 05:08

MasakiHori

総合スコア3391

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

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

moriman

2019/11/19 02:54

回答をいただきましてありがとうございます。 protocolで宣言されているプロパティやメソッドが、準拠する型の定義内ですでに実装されている場合は重ねて実装する必要はない、準拠の宣言だけでよい、ということなんですね。 わかりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問