2016-09-21 4 views
3
nicht aufrufen

Ich konnte den Punkt der Fehlermeldung dieses Compilers nicht abrufen "Kann 'getValueType' mit einer Argumentliste vom Typ '(Wert: T)' für die Zeile nicht aufrufen "if (CMFStream.getValueType (Wert: Test) = type) {"Kann 'Methodenname' mit einer Argumentliste vom Typ

public func readArray<T>() -> Array<T> 
{ 
    // ... 
    var retval: Array<T>; 
    let test: T; 
    if (CMFStream.getValueType(value: test) != type) { 
    // ... 
    } 
} 

ich denke, dass ich den Unterschied zwischen Generika und Vorlagen nicht verstehen

Vielen Dank im Voraus

Antwort

3
..

Sie übergeben ein Objekt vom Typ T bis getValueType. T ist ein unbeschränkter generischer Typ, was bedeutet, dass zum Kompilierungszeitpunkt jeder im Bereich bekannte Typ sein kann. Es hat einen bestimmten Typ, aber der Compiler weiß nicht, was dieser Typ ist. T ist ein Platzhalter dafür.

Wenn es die Zeile trifft, die getValueType mit einem Argument vom Typ T aufruft, sucht es nach einer Möglichkeit, das zu erfüllen. Der Fehler, den Sie sehen, sagt, dass es keinen Weg gefunden hat, dies zu tun.

Hier ist ein minimales Beispiel:

func foo<U>(f:U) { 
    bar(b:f) 
} 

func bar(b:Int) { 
} 

Dies schlägt fehl, da bar eine Int akzeptiert, aber foo könnte es jede Art passieren.

Es gibt zwei Möglichkeiten, dies zu beheben.

Methode 1

Make bar generic:

func bar<V>(b:V) { 
} 

so, wenn Sie

foo(f:1) 

Der Compiler Aufruf ersetzt U mit Int, die Schaffung:

func foo(f:Int) { 
    bar(b:f) 
} 

Jetzt braucht es eine Bar, die eine Int akzeptiert, so ersetzt es V mit Int

func bar(b:Int) { 
} 

Nun sind die Typen konsistent sind zu geben, damit es weitergehen kann.

Methode 2

Constrain U:

protocol P {} 

func foo<U:P>(f:U) { 
    bar(b:f) 
} 

Dieses besagt, dass beliebige U Typ ist, der P dem Protokoll entspricht. So, jetzt können wir bar wie folgt definieren:

func bar(b:P) { 
} 

Dieses eine bar definiert, die alles andere übernimmt die P zu Protokoll entspricht.

Nun, was auch immer der Platzhalter U mit ersetzt wird, weiß der Compiler, dass es zu P entspricht, und es kann immer ein bar, die etwas finden akzeptiert, die P entspricht. Der Compiler kann fortfahren.

Verwandte Themen