【问题标题】:Is there any protocol that all Swift SIMD float types conform to?是否有所有 Swift SIMD 浮点类型都符合的协议?
【发布时间】:2015-11-05 06:01:29
【问题描述】:

大多数 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”的协议,或者有什么方法可以创建这样的协议?

【问题讨论】:

标签: ios iphone swift simd


【解决方案1】:

David 的方向是正确的,这样的协议不存在(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

【讨论】:

    【解决方案2】:

    如果没有(而且似乎没有),添加您自己的很容易:

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

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

    【讨论】:

    • 您必须将func +(lhs: Self, rhs: Self) -&gt; Self 等添加到协议定义中。
    • 是的,我只是在尝试,不确定是否可以将运算符添加到协议中。在我更新答案之前......堆栈溢出忘记了我是谁......在这一点上,最简单的方法就是迟到Kame的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2018-04-24
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多