よくあるジェネリック関数の基本的なサンプル
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が+演算子にも当てはまる、みたいな話でしょうか?別の話でしょうか?
できれば公式ドキュメント的なものでどこに説明があるのかも教えていただけるとありがたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/19 02:54