尝试使用PAT应用扩展时,不符合协议错误

时间:2016-05-20 06:29:22

标签: swift generics swift-protocols

我不明白为什么会失败:

import Foundation
import simd

protocol TestProtocol {
    associatedtype ElementType
    func reduce_add(x:Self) -> ElementType
}

extension float2 : TestProtocol {
    typealias ElementType=Float
}

我在Playground中得到一个“类型'float2'不符合协议'TestProtocol'”错误。具体来说,它告诉我:

  

Playground执行失败:Untitled Page.xcplaygroundpage:3:1:   错误:类型'float2'不符合协议'TestProtocol'   extension float2:TestProtocol {^ Untitled

     

Page.xcplaygroundpage:6:10:注意:协议需要功能   'reduce_add'类型为'float2 - >的ElementType”       func reduce_add(x:Self) - >的ElementType

但是,当我查看simd界面时,我看到了:

/// Sum of the elements of the vector.
@warn_unused_result
public func reduce_add(x: float2) -> Float

如果我致电reduce_add(float2(2.4,3.1)),我会得到正确的结果。 ElementType typealiasFloat

我在哪里错了?

1 个答案:

答案 0 :(得分:1)

现有的

public func reduce_add(x: float2) -> Float
来自simd模块的

全局函数和您的协议 需要实例方法

您不能要求使用协议存在全局函数。 如果你想要一个实例方法,那么它可能如下所示:

protocol TestProtocol {
    associatedtype ElementType
    func reduce_add() -> ElementType
}

extension float2 : TestProtocol {
    func reduce_add() -> Float {
        return simd.reduce_add(self)
    }
}

let f2 = float2(2.4, 3.1)
let x = f2.reduce_add()
print(x) // 5.5