尝试使用 PAT 应用扩展时不符合协议错误
Doesn't conform to protocol error when trying to apply extension with PAT
我不明白为什么会失败:
import Foundation
import simd
protocol TestProtocol {
associatedtype ElementType
func reduce_add(x:Self) -> ElementType
}
extension float2 : TestProtocol {
typealias ElementType=Float
}
我在 Playground 中遇到 "Type 'float2' does not conform to protocol 'TestProtocol'" 错误。具体来说,它告诉我:
Playground execution failed: Untitled Page.xcplaygroundpage:3:1:
error: type 'float2' does not conform to protocol 'TestProtocol'
extension float2 : TestProtocol { ^ Untitled
Page.xcplaygroundpage:6:10: note: protocol requires function
'reduce_add' with type '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 已 typealias
编辑为 Float
。
我哪里错了?
现有
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
我不明白为什么会失败:
import Foundation
import simd
protocol TestProtocol {
associatedtype ElementType
func reduce_add(x:Self) -> ElementType
}
extension float2 : TestProtocol {
typealias ElementType=Float
}
我在 Playground 中遇到 "Type 'float2' does not conform to protocol 'TestProtocol'" 错误。具体来说,它告诉我:
Playground execution failed: Untitled Page.xcplaygroundpage:3:1: error: type 'float2' does not conform to protocol 'TestProtocol' extension float2 : TestProtocol { ^ Untitled
Page.xcplaygroundpage:6:10: note: protocol requires function 'reduce_add' with type '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 已 typealias
编辑为 Float
。
我哪里错了?
现有
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