我正在尝试为 Lerp-able (linear-interpolatable) 的类型创建一个协议。我声明它的方式与Equatable
定义方式类似:
protocol Lerpable {
func lerp(from: Self, to: Self, alpha: Double) -> Self
}
不幸的是,当我尝试实现Lerpable
for时Double
:
func lerp(from: Double, to: Double, alpha: Double) -> Double {
return from + alpha * (to - from)
}
extension Double: Lerpable {}
我收到一个错误:Type 'Double' does not conform to protocol 'Lerpable'
。
我认为这很简单,但也许我只是不明白 Equatable 是如何工作的。或者它是 Swift 中的一个特例?有什么想法吗?
更新:正确答案如下,这是代码的最终版本,供其他人参考:
protocol Lerpable {
func lerp(to: Self, alpha: Double) -> Self
}
extension Double: Lerpable {
func lerp(to: Double, alpha: Double) -> Double {
return self + alpha * (to - self)
}
}
func lerp<T: Lerpable>(from: T, to: T, alpha: Double) -> T {
return from.lerp(to, alpha: alpha)
}
我添加了全局lerp
函数,所以我仍然可以将其称为
lerp(foo, bar, alpha: 0.5)
而不是
foo.lerp(bar, alpha: 0.5)