大多数Swift SIMD浮点类型都有+ - * /运算符,所以我们可以像下面那样计算总和:
import simd
float2(2.0) + float2(2.0) // float2(4.0, 4.0)
float4(2.0) + float4(2.0) // float4(4.0, 4.0, 4.0, 4.0)
现在,让我们说我有一个泛型函数,它接受一对float2,float3或float4作为参数并返回它们的总和:
func calculateSum<T: SomeProtocolCoversThoseFloats>(a: T, b: T) -> {
return a + b
}
是否有任何类似“SomeProtocolCoversThoseFloats”的协议,或者有什么方法可以创建这样的协议?
答案 0 :(得分:2)
大卫正朝着正确的方向前进,这样的协议不存在(simd来自C和C没有协议,也就是没有惊喜),但你可以自己声明一个。为了使它能够使用+ - * /,你必须将它们添加到协议中:
import simd
protocol ArithmeticType {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
}
extension float4 : ArithmeticType {}
extension float3 : ArithmeticType {}
extension float2 : ArithmeticType {}
func sum<T: ArithmeticType>(a: T, b: T) -> T {
return a + b
}
如果需要,您还可以延长Double
,Float
,Int
等
答案 1 :(得分:1)
如果没有(并且似乎没有),则添加自己的内容很容易:
protocol SimdFloat {}
extension float2 : SimdFloat {}
extension float3 : SimdFloat {}
extension float4 : SimdFloat {}
这并不能直接解决你的问题,但因为它没有声明两个SimdFloat的实现+。