2016-05-20 8 views
0

Ich verstehe nicht, warum dies nicht möglich ist:entspricht nicht Fehler zu Protokoll, wenn sie versuchen Erweiterung anwenden mit PAT

import Foundation 
import simd 

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

extension float2 : TestProtocol { 
    typealias ElementType=Float 
} 

Ich erhalte einen „Typ‚float2‘entspricht nicht Protokoll‚Testprotokoll‘ "Fehler auf dem Spielplatz. Insbesondere es sagt mir:

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

Als ich an der simd Schnittstelle aussehen, aber ich sehe:

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

und wenn ich reduce_add(float2(2.4,3.1)) anrufe, bekomme ich das richtige Ergebnis. ElementType ist typealias ed zu Float.

Wohin gehe ich hier falsch?

Antwort

1

Die

public func reduce_add(x: float2) -> Float 
bestehenden

vom simd Modul ist eine globale Funktion und Ihr Protokoll erfordert eine Instanzmethode.

Sie können nicht das Vorhandensein einer globalen Funktion mit einem Protokoll verlangen. Wenn Sie eine Instanz-Methode möchten, dann könnte es so aussehen:

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 
+0

Ah. Ich glaube, ich war verwirrt, dass man Operatoren verlangen kann, die global sind, aber anscheinend ein Sonderfall. Wenn mein Ziel also ist, über verschiedene Vektortypen zu verallgemeinern, muss ich die gesamte simd-Bibliothek als Instanzfunktionen spiegeln. – Omegaman

+0

@ Omegaman: Ja. (Zumindest kommt mir derzeit keine Alternative in den Sinn.) –