是否所有Swift SIMD浮点类型都符合协议?

时间:2015-11-05 06:01:29

标签: ios iphone swift 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”的协议,或者有什么方法可以创建这样的协议?

2 个答案:

答案 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
}

如果需要,您还可以延长DoubleFloatInt

答案 1 :(得分:1)

如果没有(并且似乎没有),则添加自己的内容很容易:

protocol SimdFloat {}

extension float2 : SimdFloat {}
extension float3 : SimdFloat {}
extension float4 : SimdFloat {}

这并不能直接解决你的问题,但因为它没有声明两个SimdFloat的实现+。