2
私はスウィフトにおける2Dベクトル構造体を実装しています:Swiftで一般的な変換イニシャライザを実装する方法は?
public struct Vec2<T: Numeric> {
public let x: T
public let y: T
public init(_ x: T, _ y: T) {
self.x = x;
self.y = y;
}
// ...
}
public protocol Numeric: Equatable {
// ...
}
extension Int: Numeric {}
extension Double: Numeric {}
extension Float: Numeric {}
このコードはコンパイルされます。ここでは、変換初期設定子を追加して、 Vec2<Int>
からVec2<Float>
までである。私はVec2
にこれを追加しました:
public init<T2: Numeric>(_ other: Vec2<T2>) {
self.x = T(other.x)
self.y = T(other.y)
}
とNumeric
プロトコルに必要な初期化子:しかし
init(_: Int)
init(_: Double)
init(_: Float)
を、これは私が解決することができないんだエラーが発生します。
はできません型 'T'の初期化子を '(T2)型'の引数リストで呼び出す
overlo (Int)、(Double)、(Float)
どのようなアイデアですか?
問題は(デュープ質問へのわずかに異なるが、私はそれが別の答えを保証わからないんだけど)あなたのプロトコルは、そのすべての具体的なタイプがあることを保証することはできませんということです'Numeric'に準拠しているかどうかは、あなたが要件に列挙した初期化子によって処理されます。したがって、すべての型が独自の変換ロジックを実装することを保証するために、プロトコルに「シャドー」関数要件を追加するようなことを行う必要があります。これは上記のリンクされた質問に対する私の答えです。 – Hamish
@ originaluser2ありがとう、それはそれを解決! – emlai
お手伝いします:) – Hamish