..
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.