是否有任何Swift SIMD浮点类型符合的协议?
大多数雨燕SIMD浮点类型有+ - * /运营商,所以我们就可以计算器像下面的总和: 是否有任何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”或者是没有办法,我可以创建这样一个协议的任何方式?
大卫走的是正确的方向,这样的协议不存在(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
等,如果需要
如果没有(有没有出现如此),它很容易添加自己:
protocol SimdFloat {}
extension float2 : SimdFloat {}
extension float3 : SimdFloat {}
extension float4 : SimdFloat {}
这并没有真正直接解决您的问题,但是因为它不” t声明两个SimdFloat的工具+。
您必须将'func +(lhs:Self,rhs:Self) - > Self'等添加到协议定义中。 –
是的,我只是在尝试,我不确定是否可以将运营商添加到协议中。在我可以更新答案之前......堆栈溢出忘了我是谁......在这一点上,最简单的就是迟到Kame的答案去:) –
同样的技术在http://stackoverflow.com/questions/25575513/what-protocol-should-be-adopted-by-a-type-for-a-generic-function-to-take-any-num可以在这里应用。 –
啊,这是一个很酷的东西,正是我想要做的!十分感谢大家。 :) – hagmas